3 回答

TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超8個(gè)贊
Python在解釋器中存儲(chǔ)-5到256范圍內(nèi)的整數(shù):它有一個(gè)整數(shù)對(duì)象池,從中返回這些整數(shù)。這就是為什么這些對(duì)象是相同的:(0-5)
和-5
,但不(0-6)
和-6
,因?yàn)檫@些都是當(dāng)場(chǎng)創(chuàng)建。
這是CPython源代碼中的源代碼:
#define NSMALLPOSINTS 257#define NSMALLNEGINTS 5static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS];
(查看CPython的源代碼:/trunk/Objects/intobject.c
)。源代碼包括以下注釋:
/* References to small integers are saved in this array so that they can be shared. The integers that are saved are those in the range -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive). */
然后,is
運(yùn)算符將它們(-5
)相等,因?yàn)樗鼈兪窍嗤膶?duì)象(相同的內(nèi)存位置),但是另外兩個(gè)新的整數(shù)(-6
)將位于不同的內(nèi)存位置(然后is
不會(huì)返回True
)。注意,257
在上面的源代碼中是正整數(shù),因此是0 - 256
(包括)。
(來(lái)源)

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個(gè)贊
這不是一個(gè)錯(cuò)誤。is
不是一個(gè)平等的考驗(yàn)。==
會(huì)給出預(yù)期的結(jié)果。
這種行為的技術(shù)原因是Python實(shí)現(xiàn)可以自由地將同一個(gè)常量值的不同實(shí)例視為同一個(gè)對(duì)象或不同的對(duì)象。您正在使用的Python實(shí)現(xiàn)選擇使某些小常量共享同一個(gè)對(duì)象,以節(jié)省內(nèi)存。您不能依賴于此版本與版本相同的版本或不同的Python實(shí)現(xiàn)。
添加回答
舉報(bào)