[英]Is there any difference between “foo is None” and “foo == None”?
之間有什么區別:
if foo is None: pass
和
if foo == None: pass
我在大多數Python代碼(以及我自己編寫的代碼)中看到的約定是前者,但我最近遇到了使用后者的代碼。 None是NoneType的實例(也是唯一的實例,IIRC),所以沒關系,對吧? 它有什么可能的情況嗎?
如果它比較同一個對象實例, is
始終返回True
==
最終由__eq__()
方法決定
即
>>> class Foo(object):
def __eq__(self, other):
return True
>>> f = Foo()
>>> f == None
True
>>> f is None
False
提醒一句:
if foo:
# do something
不完全相同:
if x is not None:
# do something
前者是布爾值測試,可以在不同的上下文中評估為false。 在布爾值測試中有許多表示false的東西,例如空容器,布爾值。 在這種情況下,None也評估為false,但其他事情也是如此。
foo is None
的原因foo is None
首選方法是您可能正在處理定義自己的__eq__
的對象,並將對象定義為None。 因此,如果您需要查看它是否foo is None
,則始終使用foo is None
None
。
(ob1 is ob2)
等於(id(ob1) == id(ob2))
沒有區別,因為相同的對象當然是相同的。 但是, PEP 8明確指出你應該使用的is
:
像None這樣的單例的比較應該總是使用is或者不是,而不是相等的運算符。
is
對身份的測試, 而不是平等。 對於你的語句foo is none
,Python只是比較對象的內存地址。 這意味着你問的問題是“同一個對象有兩個名字嗎?”
==
另一方面,由__eq__()
方法確定的相等性測試。 它不關心身份。
In [102]: x, y, z = 2, 2, 2.0
In [103]: id(x), id(y), id(z)
Out[103]: (38641984, 38641984, 48420880)
In [104]: x is y
Out[104]: True
In [105]: x == y
Out[105]: True
In [106]: x is z
Out[106]: False
In [107]: x == z
Out[107]: True
None
是單身操作員。 所以None is None
一直是真的。
In [101]: None is None
Out[101]: True
對於None,等於(==)和identity(是)之間不應該有區別。 NoneType可能返回相等的標識。 由於None是唯一可以使用NoneType的實例(我認為這是真的),因此兩個操作是相同的。 在其他類型的情況下,情況並非總是如此。 例如:
list1 = [1, 2, 3]
list2 = [1, 2, 3]
if list1==list2: print "Equal"
if list1 is list2: print "Same"
這將打印“Equal”,因為列表的比較操作不是默認的身份返回。
@ 傑森 :
我建議使用更多的東西
if foo: #foo isn't None else: #foo is None
我不喜歡使用“if foo:”,除非foo真正代表一個布爾值(即0或1)。 如果foo是一個字符串或一個對象或其他東西,“if foo:”可能會起作用,但它看起來像是一個懶惰的快捷方式。 如果您要檢查x是否為None,請說“if x is None:”。
更多細節:
is
子句實際上檢查兩個object
是否在同一個內存位置。 即它們是否都指向相同的內存位置並具有相同的id
。
作為1的結果, is
確保是否與否,兩個詞匯表示object
■找相同屬性(屬性-的的屬性...)或不
原始類型的實例化(如bool
, int
, string
(有一些例外), NoneType
具有相同的值將始終位於相同的內存位置。
例如
>>> int(1) is int(1)
True
>>> str("abcd") is str("abcd")
True
>>> bool(1) is bool(2)
True
>>> bool(0) is bool(0)
True
>>> bool(0)
False
>>> bool(1)
True
並且由於NoneType
在python的“查找”表中只能有一個自身實例,因此前者和后者更多地是編寫代碼的開發人員的編程風格(可能是為了一致性),而不是具有任何微妙的邏輯原因選擇一個而不是另一個。
John Machin的結論是None
是一個單身,這個結論得到了這個代碼的支持。
>>> x = None
>>> y = None
>>> x == y
True
>>> x is y
True
>>>
由於None
是單例, x == None
且x is None
將具有相同的結果。 但是,根據我的美學觀點, x == None
是最好的。
a is b # returns true if they a and b are true alias
a == b # returns true if they are true alias or they have values that are deemed equivalence
a = [1,3,4]
b = a[:] #creating copy of list
a is b # if gives false
False
a == b # gives true
True
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.