蟒蛇是字符串操作行为蟒蛇是字符串操作行为(python is operator behaviour

2019-05-12 03:41发布

我无法理解以下行为。 我创建两个字符串,并使用is运算符来进行比较。 在第一种情况下,它的工作方式不同。 在第二种情况下,它按预期工作。 什么是当我用逗号或空格,它显示的原因False与比较is ,当不使用逗号或空格或其他字符,它使True

Python 3.6.5 (default, Mar 30 2018, 06:41:53) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 'string'
>>> b = a
>>> b is a
True
>>> b = 'string'
>>> b is a
True
>>> a = '1,2,3,4'
>>> b = a
>>> b is a
True
>>> b = '1,2,3,4'
>>> b is a
False

是否有蟒蛇为什么在解释不同的方式串一个可靠的信息? 据我所知,最初, ab指的是同一个对象。 然后b得到一个新的对象,仍然b is aTrue 。 这是有点混乱,理解的行为。

当我与“串”做到这一点 - 它会产生相同的结果。 当我使用“1,2,3,4”什么是错的 - 他们都是字符串。 什么是从例1和例2有什么不同? 即is操作者产生用于串的不同的内容不同的结果。

Answer 1:

有关此问题的一个重要的事情就是,Python缓存一些居多,短字符串(通常少于20个字符,但不为他们的每一个组合),使他们成为快速访问。 对于一个重要的原因是,字符串被广泛应用于Pyhton的源代码,这是一个内部优化缓存一些特殊种类的字符串。 字典是Python的源代码通常使用的数据结构的一个用于存放的变量,属性和一般的命名空间,加上一些其他的目的,他们都使用字符串作为对象名称。 这就是说,每次您尝试访问对象属性或访问一个变量(局部或全局)有一个字典里查内生火。

现在,你有这样的怪异行为的原因是因为Python(CPython的实现)用绳子把不同的方式在实习方面。 在Python的源代码有一个intern_string_constants功能,让字符串被拘留,你可以查询详细的验证。 或查看全面的文章http://guilload.com/python-string-interning/ 。

它也注意到值得Python有一个intern()函数sys ,您可以手动使用实习生字符串模块。

In [52]: b = sys.intern('a,,')

In [53]: c = sys.intern('a,,')

In [54]: b is c
Out[54]: True

如果你愿意,你可以使用此功能固定的字典查找或当你应该在你的代码经常使用特定的字符串对象。

你不应该用绳子实习混淆的另一点是,当你做a == b你要创建两个引用同一个对象,它是明显针对这些关键字有相同的id

关于标点符号,看来,如果他们是一个字符,如果其长度超过one.If长度超过一个,他们不会得到缓存他们得到实习。 正如在评论中提到的,其中的一个原因可能是因为它是关键字字典关键字不太可能有标点符号在其中。

In [28]: a = ','

In [29]: ',' is a
Out[29]: True

In [30]: a = 'abc,'

In [31]: 'abc,' is a
Out[31]: False

In [34]: a = ',,'

In [35]: ',,' is a
Out[35]: False

# Or

In [36]: a = '^'

In [37]: '^' is a
Out[37]: True

In [38]: a = '^%'

In [39]: '^%' is a
Out[39]: False

不过还是这些只是,你不能在你的代码依赖于一些猜测。



文章来源: python is operator behaviour with string