Python ';是';操作员未处理具有相同标识的对象

Python ';是';操作员未处理具有相同标识的对象,python,python-2.7,python-2.x,cpython,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 根据: 运算符为且不为测试对象标识:x为y为True当且仅当x与y为同一对象时 要获取对象的标识,我们可以使用 如果我们打开一个新的REPL,我们可以看到300和-6具有相同的标识(on,这意味着两者引用相同的内存地址): 请注意,实际值可能因执行而异,但它们始终相等 但是,执行300 is-

我在跑步:

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
根据:

运算符
不为
测试对象标识:
x为y
True
当且仅当
x
y
为同一对象时

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


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

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

但是,执行
300 is-6
会产生
False

>>> 300 is -6
False
我有几个问题:

  • 300
    -6
    为什么(以及如何)具有相同的身份
  • 如果是这样,为什么
    300是-6
    产生
    False
执行
id(300)
后,不再存在对
300
的引用,因此该id被释放。当您执行id(6)时,它将获得相同的内存块并存储6。当您执行
-300是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(300)
),因为不存在对它的其他引用。

REPL重用
id
。试试这个,你就会明白:
print(id(300))或print(id(-6))或300 is-6无法在Windows上用Python 3复制
Python 3.4.2(v3.4.2:ab2c023a9432,2014年10月6日,22:15:05)[MSC v.1600 32位(英特尔)]键入“帮助”、“版权”、“信用”或“许可证”以获取更多信息。>>id(300)7807344>>>id(-6)8757184>>>id(300)8757184>>>id(-6)8755376
但是,它在Centos的Python 2中复制了Python 2.6.6(r266:8429220012年9月11日,08:34:23)[GCC 4.4.6 20120305(Red Hat 4.4.6-4)],有关详细信息,请键入“帮助”、“版权”、“信用”或“许可证”。>>id(300)15912616>>>id(-6)15912616>>id(300)15912616
@cᴏʟᴅsᴘᴇᴇᴅ 顺便问一下,您是否有任何来源可以支持这一点?另外值得注意的是,Python缓存的inetegers的范围为[-5256]:
>>6是6真>>-999是-999假
我刚刚验证了您的说法。这让我完全明白了,我会使用另一个例子,而不是6,因为它在Python缓存的整数范围内(-5到256):
>>6是6真>>-999是-999假
@DeepSpace很好!编辑。我当时不明白那句话,但现在我明白了!
>>> a, b = -300, 6
>>> id(a)
some number
>>> id(b)
some different number; 6 is still in the other memory address.