代码"python" is "python"
返回True
。但是为什么(1,2,3) is (1,2,3)
返回False
?尽管两者都是不可变对象,但is
运算符的求值方式不同。为什么?
运算符是,不是测试对象标识:x是y是真的,当且仅当x和y是同一对象。x不是y产生相反的真值。
您可以将标识视为对象在内存中的地址。所以对于具有相同索引的2个元组,我们有不同的地址在这种情况下,基于您的解释器和解释器中的以上内容,相等的字符串指向一个内存地址
为了更好地理解,请参阅下面的演示:
>>> a=(0,1)
>>> b=a
>>> a is b
True
>>> c=(0,1)
>>> a is c
False
is返回True。解释器可以对不可变对象使用interning,但不能保证。
您的第一个示例是True
的唯一原因是,从源代码加载字符串文字时会被插入(我认为这甚至只适用于单个文件中的字符串)。
除了字符串文字之外,几乎在所有情况下,在不同时间创建的对象都将具有不同的ID。
如果有任何疑问,X is Y
会检查X
和Y
是否引用了同一个对象。它不检查这两个对象是否相等。
现在回答您的问题:
对于给定的文字A
,您通常不应该对A is A
是返回True
还是返回False
抱有任何期望
我们非常清楚CPython是如何在内部工作的,因此我们可以解释为什么每个特定的案例都会如此。也就是说,除了在一些真正特殊的情况下,最好将其视为一个实施细节。在不同的Python解释器中,或者在不同版本的CPython中,它可以表现得很好。
当然,这并不意味着is
没有用处。是的,只是在这种情况下不是。