![](/img/trans.png)
[英]What is the source code of __hash__() and __eq__() of object in Python?
[英]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),它如何才能落在正確的鍵上。
我在散列上看到的所有文檔總是一起提到hash和eq ,從不提及cmp , ne等,這使我認為這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.