Python中進(jìn)行None判斷時(shí),為什么用is而不是==

開(kāi)始圖片.jpg

isNone區(qū)別在哪里」

  • is比較的是對(duì)象標(biāo)識(shí)符,用來(lái)檢查對(duì)象的標(biāo)識(shí)符是否一致,即兩個(gè)對(duì)象在內(nèi)存中的地址是否一致。在使用a is b的時(shí)候,相當(dāng)于是做id(a)==id(b)判斷。
  • ==比較兩個(gè)對(duì)象的值是否相等,相當(dāng)于調(diào)用__eq__()方法,即a==b等同于a.__eq__(b)。

「進(jìn)行None判斷時(shí),為什么用is

▍這在PEP8中有所規(guī)定

"Comparisons to singletons like None should always be done with 'is' or 'is not', never the equality operators."
--- From PEP8

▍為什么會(huì)有這樣的規(guī)定

如上所述None在Python里是個(gè)單例對(duì)象,一個(gè)變量如果是None,它一定和None指向同一個(gè)內(nèi)存地址。None是python中的一個(gè)特殊的常量,表示一個(gè)空的對(duì)象??罩凳荘ython中的一個(gè)特殊值,數(shù)據(jù)為空并不代表是空對(duì)象,例如[],'',(),{}等都不是None。

a = None
b = None
print(id(a) == id(b)) # True

print([] is None) # False
print('' is None) # False

None和任何對(duì)象比較返回值都是False,除了自己。==None背后調(diào)用的__eq__(),而__eq__()可以被重載,e.g.

class test():
    def __eq__(self, other):
        return True

t = test()
print(t is None) # False
print(t == None) # True

雖然很多時(shí)候用==None會(huì)得到我們內(nèi)心想要的結(jié)果,但是如果一個(gè)對(duì)象的__eq__()方法被重載,==操作可能會(huì)影響結(jié)果的判斷。對(duì)了,像PyCharm這樣的IDE一般會(huì)提示==None不符合PEP8規(guī)范,不知大家注意過(guò)沒(méi)有。

另外從代碼執(zhí)行效率上來(lái)看,is is a LOT faster than ==。


在這里插入圖片描述

以上!

每天進(jìn)步一點(diǎn)點(diǎn).jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 6,328評(píng)論 0 10
  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類(lèi): pyspark.sql...
    mpro閱讀 9,914評(píng)論 0 13
  • 注: 運(yùn)行環(huán)境:python3.6.6,win10,64位 1. None None是python中的一個(gè)特殊的常...
    諸葛小愚閱讀 19,494評(píng)論 0 12
  • 裝修不是有錢(qián)了就要瞎倒騰那么簡(jiǎn)單。也不全是為了臭美,才會(huì)去費(fèi)力費(fèi)神費(fèi)腦筋。 裝修這個(gè)詞好像在中國(guó)古代是...
    重回唐朝一史文銀閱讀 333評(píng)論 0 1
  • 去一家小店, 想著吃點(diǎn)什么? 等候其間偶然一撇, 最近隨手拍的習(xí)慣, 拿起手機(jī)就是幾張。 晚飯呢就多了點(diǎn)工作, 把...
    永利影視工作室閱讀 291評(píng)論 0 2

友情鏈接更多精彩內(nèi)容