在這篇之前,我又專門翻譯過官方python3.3的可哈希對象文檔,大家可以先參考一下:
實習小記-python中可哈希對象是個啥?what is hashable object in python?
預(yù)備知識:
在定義一個類時,如果我們需要改寫該類的__eq__函數(shù),特別要注意的是它將會變?yōu)椴豢晒ο螅簿褪钦f如果你將它放到哈希集會報錯誤
>>> class A:... def __init__(self, x):... self.x = x... def __eq__(self, other):... return self.x == other.x...>>> a = A(1)>>> b = A(1)>>> a == bTrue>>> dic = {a:1}Traceback (most recent call last): File "<
可是如果我們定義的這個類既需要重寫__eq__函數(shù)也需要把它設(shè)定為可哈希的對象這該怎么辦呢?官方文檔里面已經(jīng)詳細描述了,我們只需在類變量中加上__hash__ = object.__hash__ 即可。
>>> class A:... __hash__ = object.__hash__... def __init__(self, x):... self.x = x... def __eq__(self, other):... return self.x == other.x...>>> a = A(1)>>> b = A(1)>>> a == bTrue>>> dic = {a:1}>>>
那么問題來了,如果我們想用b為鍵值查找dic中對應(yīng)的數(shù)據(jù)可以成功嗎?
>>> dic[a]1>>> dic[b] #提示鍵值錯誤Traceback (most recent call last): File "<ipython-input-13-5e085ba4c448>", line 1, in <module> dic[b]KeyError: <__main__.A object at 0x103b77610>>>> a.__hash__() #這里我們發(fā)現(xiàn)a和b的哈希值是不一樣的272332629>>> b.__hash__()272332641>>> hash(a) == hash(b)False
從上面的代碼我們知道,在哈希集中對某個鍵值的查找是針對該鍵值的哈希值做比較的。即使我們重寫了__eq__也不會影響到哈希集中對應(yīng)鍵值的查找。
新聞熱點
疑難解答