“is”运算符不适用于具有相同身份的对象[重复]

问题描述 投票:0回答:2

我正在跑步:

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

根据文档

运算符

is
is not
测试对象同一性:当且仅当
x is y
True
同一个对象
时,
x
y

要获取对象的 identity,我们可以使用

id
函数


如果我们打开一个新的 REPL,我们可以看到

300
-6
具有相同的标识(在 CPython 上,这意味着两者都引用相同的内存地址):

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

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

但是,执行

300 is -6
会产生
False
:

>>> 300 is -6
False

我有几个问题:

  • 为什么(以及如何
    300
    -6
    拥有相同的身份?
  • 如果他们这样做,为什么
    300 is -6
    会产生
    False
python python-2.7 python-2.x cpython
2个回答
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.

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


8
投票

这是

id()
函数的记录行为:

返回对象的“身份”。这是一个整数(或长 整数),保证该对象是唯一且恒定的 在其生命周期内。 两个具有不重叠生命周期的对象可能 具有相同的

id()
值。

示例代码中整数对象的生命周期只是函数调用(例如

id(300)
),因为不存在对其的其他引用。

© www.soinside.com 2019 - 2024. All rights reserved.