为什么(0-6)是-6 =假?

为什么(0-6)是-6 =假?

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


>>> (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'>

>>> 


慕的地6264312
浏览 840回答 3
3回答

慕森卡

Python在解释器中存储-5到256范围内的整数:它有一个整数对象池,从中返回这些整数。这就是为什么这些对象是相同的:(0-5)和-5,但不(0-6)和-6,因为这些都是当场创建。这是CPython源代码中的源代码:#define&nbsp;NSMALLPOSINTS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;257#define&nbsp;NSMALLNEGINTS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5static&nbsp;PyIntObject&nbsp;*small_ints[NSMALLNEGINTS&nbsp;+&nbsp;NSMALLPOSINTS];(查看CPython的源代码:/trunk/Objects/intobject.c)。源代码包括以下注释:/*&nbsp;References&nbsp;to&nbsp;small&nbsp;integers&nbsp;are&nbsp;saved&nbsp;in&nbsp;this&nbsp;array&nbsp;so&nbsp;that&nbsp;they &nbsp;&nbsp;&nbsp;can&nbsp;be&nbsp;shared. &nbsp;&nbsp;&nbsp;The&nbsp;integers&nbsp;that&nbsp;are&nbsp;saved&nbsp;are&nbsp;those&nbsp;in&nbsp;the&nbsp;range &nbsp;&nbsp;&nbsp;-NSMALLNEGINTS&nbsp;(inclusive)&nbsp;to&nbsp;NSMALLPOSINTS&nbsp;(not&nbsp;inclusive). */然后,is运算符将它们(-5)相等,因为它们是相同的对象(相同的内存位置),但是另外两个新的整数(-6)将位于不同的内存位置(然后is不会返回True)。注意,257在上面的源代码中是正整数,因此是0 - 256(包括)。(来源)

皈依舞

这不是一个错误。is不是一个平等的考验。==会给出预期的结果。这种行为的技术原因是Python实现可以自由地将同一个常量值的不同实例视为同一个对象或不同的对象。您正在使用的Python实现选择使某些小常量共享同一个对象,以节省内存。您不能依赖于此版本与版本相同的版本或不同的Python实现。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python