[英]identity versus equality for None in Python
各種Python指南說使用x is None
而不是x == None
。 這是為什么? 平等是用於比較值的,所以他很自然地問,如果x
的值是None
,表示用==
,而不是is
。 有人可以解釋為什么is
首選形式,並顯示一個例子,其中兩個不給出相同的答案?
謝謝。
人們使用的原因is
是因為沒有優勢,使用==
。 可以編寫比較等於None
對象,但這種情況並不常見。
class A(object):
def __eq__(self, other):
return True
print A() == None
輸出:
True
的is
運營商也快,但我不認為這確實非常重要。
該is
關鍵字測試身份。 它不是像==
那樣的比較運算符。 使用is
不只是測試兩個參數是否具有相同的值和/或相同的內部結構:即,它測試兩者是否實際引用內存中的同一對象。 這有很多含義,其中一個is
無法重載,另一個是可變類型和不可變類型之間的行為不同。 例如,請考慮以下事項:
>>> l1 = range(5)
>>> l2 = range(5)
>>> l1 == l2
True
>>> l1 is l2
False
>>> l3 = l1
>>> l1 is l3
True
>>> s1 = "abcde"
>>> s2 = "abcde"
>>> s1 == s2
True
>>> s1 is s2
True
在這里,由於列表是可變的,它們不能共享內存中的位置,因此is
與==
產生不一致的結果。 另一方面,字符串是不可變的,因此在某些情況下可以合並它們的存儲器。 基本上, is
只能可靠地用於簡單的,不可變的類型,或者在情況下,當多個名稱指向完全相同的對象在存儲器(如使用的l3
在上面的例子),並且它的使用指示來測試同一性的欲望而不是價值。 我希望is
比稍快==
,因為它不執行方法查找,但我可能是錯誤的。 當然,對於像列表或類型的字典復雜容器對象, is
應該比快得多==
(O(1)與O(N),據推測)。 也就是說,速度問題大多是一個有爭議的問題,因為這兩者不應被視為可互換。
PEP 8說:“對像單身人士這樣的單身人士的比較應該始終用'是'或'不是'來做,而不是平等操作員。” 這是一個很好的解釋原因:
http://jaredgrubb.blogspot.com/2009/04/python-is-none-vs-none.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.