
開(kāi)始圖片.jpg
「is和None區(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