我在Windows 7 x64上使用内置IDLE的python 2.7.2,发现了一个非常奇怪的事情:
>>> a = "aaa"
>>> b = "aaa"
>>> print a is b
True
>>> print a == b
True
>>> print "%s , %s" % (id(a), id(b))
43872224 , 43872224
>>>
这是正常的,但是,如果字符串包含空格:
>>> x = "x x"
>>> y = "x x"
>>> print x is y
False
>>> print x == y
True
>>> print "%s , %s" % (id(x), id(y))
43872008 , 43872128
>>>
注意x is y
是False
!他们有不同的ID!
我在PyCharm中尝试了这些代码,一切都返回True
,所以我认为这可能是IDLE的错误。
不是吗?或者我会错过什么?
答案 0 :(得分:3)
Python的是运算符实际上检查它传递的参数是否是同一个对象,所以在这种情况下,虽然它们是相同的值,但它们不是同一个对象。
以前这里已经讨论过这个问题:with a lot more detail也值得一试。
答案 1 :(得分:2)
所有这一切都意味着IDLE实现了与解释器或PyCharm默认的不同string interning策略。如果字符串被中断,则两个相等的字符串将是相同的字符串 - 即,a == b
将暗示a is b
。如果不是,那么你可以使用前者而不使用后者,就像其他python对象一样:
>>> a = ['']
>>> b = ['']
>>> a is b
False
>>> a == b
True
编辑:据我所知,通过实验,交互式解释器不会实现这些字符串。但是,将其作为.py脚本运行实习它们。这很可能是Python将从STDIN读取的字符串或磁盘文件与源代码文件中的字符串文字区别对待。