'is'运算符不处理具有相同标识的对象

Mat*_*ero 4 python cpython python-2.x python-2.7

我在跑:

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
Run Code Online (Sandbox Code Playgroud)

根据文件:

运营商isis not测试对象标识:x is yTrue当且仅当xy相同的对象.

为了获得对象的身份,我们可以使用该id功能.


如果我们打开一个新的REPL,我们可以看到它300-6具有相同的标识(在CPython上,这意味着它们都引用相同的内存地址):

>>> id(300)
94766593705400
>>> id(-6)
94766593705400
Run Code Online (Sandbox Code Playgroud)

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

然而,做300 is -6收益率False:

>>> 300 is -6
False
Run Code Online (Sandbox Code Playgroud)

我有一些问题:

  • 为什么(以及如何)做300-6分享相同的身份?
  • 如果他们这样做,为什么要300 is -6屈服False

int*_*ser 10

id(300)执行,没有更多的引用300存在,所以ID被释放.执行时id(6),它会获得相同的内存块并存储6个.当你这样做-300 is 6,-300并且6都被同时引用时,它们将不再具有相同的地址.

如果您继续引用两者-300,则会6发生以下情况:

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

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

  • 我使用的另一个例子不是6,因为它在Python缓存的整数范围内(-5到256):`>>> 6是6 True >>> -999是-999 False (2认同)

Eug*_*ash 8

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

返回对象的"标识".这是一个整数(或长整数),保证在该生命周期内该对象是唯一且恒定的.具有非重叠寿命的两个对象可以具有相同的id()值.

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

  • 我当时无法理解这句话,但现在我做到了! (3认同)