我正在使用可散列物件作為字典的鍵。這些物件是可散列的,我可以將鍵值對存盤dict在KeyError.
這是一些小示例代碼:
class Object:
def __init__(self, x): self.x = x
def __hash__(self): return hash(self.x)
o1 = Object(1.)
o2 = Object(1.)
hash(o1) == hash(o2) # This is True
data = {}
data[o1] = 2.
data[o2] # Desired: This should output 2.
在我上面的場景中,我怎樣才能實作data[o2]也回傳2.?
uj5u.com熱心網友回復:
您需要同時實作__hash__and __eq__:
class Object:
def __init__(self, x): self.x = x
def __hash__(self): return hash(self.x)
def __eq__(self, other): return self.x == other.x if isinstance(other, self.__class__) else NotImplemented
根據Python 檔案:
如果一個類沒有定義一個
__eq__()方法,它也不應該定義一個__hash__()操作
找到哈希后,Python 的字典會比較使用的鍵__eq__并意識到它們是不同的,這就是你沒有得到正確輸出的原因。
uj5u.com熱心網友回復:
您可以使用__eq__魔術方法對您的物件進行相等檢查。
def __eq__(self, other):
if (isinstance(other, C)):
return self.x == self.x
您可以從此鏈接了解有關魔術方法的更多資訊。
uj5u.com熱心網友回復:
因此,如前所述,您的物件需要實作 __ eq__ 特征(平等 ==),如果您想了解原因:
有時不同物件的哈希值相同,這稱為碰撞。字典通過測驗物件是否相等來管理它。如果它們不是字典,則必須管理沖突。他們如何做到這一點是實施細節,并且可能會有很大差異。一個虛擬實作將是元組鍵值的串列。
在引擎蓋下,一個虛擬的實作可能看起來像這樣:
dico[key] = [(object1, value), (object2, value)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/421243.html
標籤:
