簡體   English   中英

“foo is None”和“foo == None”之間有什么區別嗎?

[英]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

您可能希望閱讀此對象標識和等效性

語句'is'用於對象標識,它檢查對象是否引用同一個實例(內存中的相同地址)。

'=='語句指的是相等(相同的值)。

提醒一句:

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:”。

更多細節:

  1. is子句實際上檢查兩個object是否在同一個內存位置。 即它們是否都指向相同的內存位置並具有相同的id

  2. 作為1的結果, is確保是否與否,兩個詞匯表示object ■找相同屬性(屬性-的的屬性...)或不

  3. 原始類型的實例化(如boolintstring (有一些例外), 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 == Nonex 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM