is
和None
區別在哪裏」is
比較的是對象標識符,用來檢查對象的標識符是否一致,即兩個對象在內存中的地址是否一致。在使用a is b
的時候,至關因而作id(a)==id(b)
判斷。==
比較兩個對象的值是否相等,至關於調用__eq__()
方法,即a==b
等同於a.__eq__(b)
。None
判斷時,爲何用is
」PEP8
中有所規定"Comparisons to singletons like None should always be done with 'is' or 'is not', never the equality operators."
--- From PEP8
如上所述None在Python裏是個單例對象
,一個變量若是是None,它必定和None指向同一個內存地址。None是python中的一個特殊的常量,表示一個空的對象。空值是Python中的一個特殊值,數據爲空並不表明是空對象
,例如[],'',(),{}
等都不是None。python
a = None b = None print(id(a) == id(b)) # True print([] is None) # False print('' is None) # False
None和任何對象比較返回值都是False,除了本身。==None
背後調用的__eq__()
,而__eq__()
能夠被重載,e.g.spa
class test(): def __eq__(self, other): return True t = test() print(t is None) # False print(t == None) # True
雖然不少時候用==None
會獲得咱們心裏想要的結果,可是若是一個對象的__eq__()
方法被重載,==
操做可能會影響結果的判斷。對了,像PyCharm這樣的IDE通常會提示==None
不符合PEP8規範,不知你們注意過沒有。code
另外從代碼執行效率上來看,is
is a LOT faster than ==
。
以上!對象