为什么运算符为不可变对象提供不同的输出



代码"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会检查XY是否引用了同一个对象。它不检查这两个对象是否相等。

现在回答您的问题:

对于给定的文字A,您通常不应该对A is A是返回True还是返回False抱有任何期望

我们非常清楚CPython是如何在内部工作的,因此我们可以解释为什么每个特定的案例都会如此。也就是说,除了在一些真正特殊的情况下,最好将其视为一个实施细节。在不同的Python解释器中,或者在不同版本的CPython中,它可以表现得很好。

当然,这并不意味着is没有用处。是的,只是在这种情况下不是。

最新更新