'是' operator不处理具有相同标识的对象

时间:2017-12-20 13:22:13

标签: python python-2.7 python-2.x cpython

我正在跑步:

Python 2.7.8 (default, Oct  6 2017, 09:25:50)
GCC 4.1.2 20070626 (Red Hat 4.1.2-14) on Linux 2

根据the documentation

  

对象标识isis not运算符x is y True x当且仅当y和{ {1}}是相同的对象

要获取对象的身份,我们可以使用id function

如果我们打开一个新的REPL,我们可以看到300-6具有相同的身份(在CPython上,这意味着两者都引用相同的内存地址):< / p>

>>> id(300)
94766593705400
>>> id(-6)
94766593705400

请注意,实际值可能因执行而异,但它们始终相等。

然而,执行300 is -6会产生False

>>> 300 is -6
False

我有几个问题:

  • 为什么(以及如何300-6共享相同的身份?
  • 如果他们这样做,为什么300 is -6会产生False

2 个答案:

答案 0 :(得分:10)

执行id(300)后,不再存在对300的引用,因此会释放id。执行id(6)时,它会获得相同的内存块并存储6。执行-300 is 6时,-3006同时被引用,因此它们将不再具有相同的地址。

如果您继续引用-3006,则会发生以下情况:

>>> a, b = -300, 6
>>> id(a)
some number
>>> id(b)
some different number; 6 is still in the other memory address.

注意:在CPython中,从-5到256(我认为)的数字被缓存,并且将始终具有相同的地址,因此不会发生这种情况。

答案 1 :(得分:8)

这是id()函数的记录行为:

  

返回对象的“标识”。这是一个整数(或长整数)   整数)保证对于该对象是唯一的和常量的   在其一生中。 具有非重叠生命期的两个对象可以   具有相同的id()值。

示例代码中整数对象的生命周期只是函数调用(例如id(300)),因为不存在对它的其他引用。