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.