迷幻的結(jié)果
關(guān)鍵詞is用來(lái)判定兩個(gè)變量是不是同一個(gè)對(duì)象。
它們?nèi)绻趦?nèi)存中是同一個(gè)地址,就返回True梅肤,否則返回False。
如果在內(nèi)存中不是同一個(gè)地址邑茄,就算是值是一樣的凭语,也會(huì)返回返回False。
在交互式Python下撩扒,運(yùn)行這段代碼:
>>> a = 198
>>> b = 198
>>> a is b
True
打印結(jié)果是True,說(shuō)明a和b是同一個(gè)對(duì)象。
再看這段:
>>> a = 257
>>> b = 257
>>> a is b
False
打印結(jié)果竟然是False搓谆,說(shuō)明a和b不是同一個(gè)對(duì)象炒辉。
注意:必須在交互式Python下運(yùn)行才會(huì)有這樣的結(jié)果,后面會(huì)解釋為什么泉手。
這就奇怪了黔寇,為什么198是同一個(gè)對(duì)象,257就不是了呢斩萌?
再看這個(gè):
>>> a = 257;b=257 #兩個(gè)賦值語(yǔ)句寫(xiě)在同一行缝裤,用分號(hào)隔開(kāi)
>>> a is b
True
打印的結(jié)果竟然又成了True。WTF????
解惑
上面的詭異現(xiàn)象是由于Python解釋器的優(yōu)化造成的颊郎。
Python把一定常見(jiàn)的數(shù)字(-5到256)放在一個(gè)統(tǒng)一的地方憋飞,如果程序中用到了就會(huì)直接使用這個(gè)統(tǒng)一的地方的數(shù)字。198屬于這個(gè)范圍姆吭,所以不管我們定義多少不同的變量榛做,實(shí)際上都是用的這同一個(gè),放在內(nèi)存中是同一個(gè)地方内狸。
而257不屬于上面的范圍检眯,雖然a和b都是257。定義新的變量的時(shí)候昆淡,內(nèi)存中會(huì)開(kāi)辟一個(gè)新的地址保存257锰瘸。我們用is是比較的內(nèi)存地址,所以是False昂灵。如果我們用==做比較避凝,他們比較的是值,就是相同的倔既。
那第三段怎么又是True了呢恕曲?那是因?yàn)镻ython的解釋器還有一個(gè)優(yōu)化,如果兩個(gè)變量在同一個(gè)代碼塊中(在例子中是同一行渤涌,所以肯定是同一個(gè)代碼塊),那么為了節(jié)省空間佩谣,值相同的變量也會(huì)共用同一個(gè)內(nèi)存空間。所以就又是True了实蓬。
如果我們把這些代碼放在同一個(gè)Python文件中執(zhí)行茸俭,也被認(rèn)定為同一個(gè)代碼塊,也會(huì)共用同一個(gè)變量安皱。
a = 257
b = 257
print(a is b)
執(zhí)行結(jié)果為T(mén)rue调鬓。