我正在跑步:
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
和{ {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
?答案 0 :(得分: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(我认为)的数字被缓存,并且将始终具有相同的地址,因此不会发生这种情况。
答案 1 :(得分:8)
这是id()
函数的记录行为:
返回对象的“标识”。这是一个整数(或长整数) 整数)保证对于该对象是唯一的和常量的 在其一生中。 具有非重叠生命期的两个对象可以 具有相同的
id()
值。
示例代码中整数对象的生命周期只是函数调用(例如id(300)
),因为不存在对它的其他引用。