我正在跑步:
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
。
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
?执行
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(我认为)的数字被缓存,并且将始终具有相同的地址,因此不会发生这种情况。
id()
函数的记录行为:
返回对象的“身份”。这是一个整数(或长 整数),保证该对象是唯一且恒定的 在其生命周期内。 两个具有不重叠生命周期的对象可能 具有相同的
值。id()
示例代码中整数对象的生命周期只是函数调用(例如
id(300)
),因为不存在对其的其他引用。