比较两个相同的字符串,但在IDLE中得到不同的结果

时间:2012-02-20 12:45:59

标签: python reference comparison python-idle

我在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 yFalse!他们有不同的ID!

我在PyCharm中尝试了这些代码,一切都返回True,所以我认为这可能是IDLE的错误。

不是吗?或者我会错过什么?

2 个答案:

答案 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读取的字符串或磁盘文件与源代码文件中的字符串文字区别对待。