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

时间:2014-10-04 07:58:18

标签: python

代码"python" is "python"返回True。但为什么(1,2,3) is (1,2,3)会返回False?即使两者都是不可变对象,is运算符的评估也不同。为什么呢?

4 个答案:

答案 0 :(得分:1)

  

运算符 is 不是测试对象标识:当且仅当x和y是同一个对象时,x是y才为真。 x不是y产生反向真值。

你可以将身份视为对象在内存中的地址。所以对于具有相同索引的2元组,我们有不同的地址! ,在这种情况下,根据您的解释器和解释器上面的内容,相等的字符串指向一个内存地址

为了更好地理解,请参阅下面的演示:

>>> a=(0,1)
>>> b=a
>>> a is b
True
>>> c=(0,1)
>>> a is c
False

答案 1 :(得分:0)

如果两个操作数都引用同一个对象,则返回

。解释器可以使用实际的不可变对象,但不能保证。

答案 2 :(得分:0)

你的第一个例子是True的唯一原因是当从源代码加载时字符串文字被实现(我认为这仅适用于单个文件中的字符串)。

在除字符串文字之外的几乎所有情况下,在不同时间创建的对象将具有不同的ID。

答案 3 :(得分:0)

如果有任何疑问,X is Y会检查XY refer to the same object。它检查两个对象是否相等。

现在回答你的问题:

对于给定的文字A is A True是否会返回FalseA,您通常不会有任何期望。

我们非常清楚CPython在内部是如何工作的,所以we can explain为什么每个特定情况的行为都是这样的。也就是说,除了在一些真正特殊情况下,最好将其视为实施细节。在不同的Python解释器中,或者在不同版本的CPython中,它的行为可能会有所不同。

当然,这并不意味着is没用。在这种情况下,就是这样。