Python为什么(0-6) is -6 = False?

问题:

 可能重复:
Python “is” operator behaves unexpectedly with integers

今天我试图调试我的项目,经过几个小时的分析,我得到了:

>>> (0-6) is -6
False

但,

>>> (0-5) is -5
True

你能解释一下,为什么?
也许这是某种错误或非常奇怪的行为。

> Python 2.7.3 (default, Apr 24 2012, 00:00:54) [GCC 4.7.0 20120414 (prerelease)] on linux2
>>> type(0-6) 
<type 'int'>
>>> type(-6) 
<type 'int'>
>>> type((0-6) is -6)
<type 'bool'>
>>> 

回答:

从-5到256之间的所有整数被缓存为与CPython共享相同地址的全局对象,因此is测试通过。
这个工件在http://www.laurentluce.com/posts/python-integer-objects-implementation/中详细解释,我们可以检查http://hg.python.org/cpython/file/tip/Objects/longobject.c中的当前源代码

一个特定的结构用于引用小整数并共享它们,因此访问速度很快。它是一个262个整数对象指针的数组。这些整数对象在初始化期间被分配到我们上面看到的整数对象块中。小的整数范围是从-5到257.许多Python程序花费大量时间使用该范围内的整数,所以这是一个聪明的决定。

This is only an implementation detail of CPython and you shouldn’t rely on this.例如,PyPy实现了整数返回的id,所以(0-6) is -6总是为真,即使它们在内部是“不同的对象”;它还允许您配置是否启用此整数缓存,甚至设置下限和上限。但一般来说,从不同来源检索的对象将不一样。如果要比较平等,只需使用==

Code问答: http://codewenda.com/topics/python/
Stackoverflow: Why (0-6) is -6 = False?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

8 + 2 =