簡體   English   中英

Python字典的__hash__和__eq__評估的順序是什么?

[英]What's the order of __hash__ and __eq__ evaluation for a Python dict?

我試圖了解Python字典必須在內部執行哪些操作才能找到鍵。 在我看來, 哈希將首先被評估,如果發生沖突,Python將遍歷鍵,直到找到eq返回True的鍵為止。 這讓我想知道為什么以下代碼有效(僅測試代碼以了解內部原理):

class MyClass(object):
    def __eq__(self, other):
        return False

    def __hash__(self):
        return 42

if __name__=='__main__':

    o1 = MyClass()
    o2 = MyClass()
    d = {o1: 'o1', o2: 'o2'}
    assert(o1 in d)      # 1
    assert(d[o1]=='o1')  # 2
    assert(o2 in d)      # 3
    assert(d[o2]=='o2')  # 4

字典是否不應該找不到正確的鍵(在#2和#4兩種情況下都返回'o1'或'o2',或者拋出錯誤,具體取決於內部實現)。 在這兩種情況下,當它永遠無法正確地“等同”於鍵時(因為eq返回False),它如何才能落在正確的鍵上。

我在散列上看到的所有文檔總是一起提到hasheq ,從不提及cmpne等,這使我認為這2種在這種情況下才起作用。

您用作dict鍵的任何內容都必須滿足bool(x == x) is True的不變性。 (我只是說x == x ,但是有一些甚至不是布爾值的合理對象。)

該dict假定這將成立,因此它用於檢查鍵是否相等的例程實際上首先使用==檢查對象身份。 初步檢查是實現細節; 您不應該依賴它的發生或不發生。

(x == x) is not True合理對象包括float('nan')numpy.array([1, 2])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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