簡體   English   中英

Python中的None與identity相同

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

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