我想使用一个类作为字典键,并实现了 hash 函数,它似乎可以工作。但是,当我有一个具有相同哈希值的类的不同实例时,它不会被识别为包含在字典中。 MWE:
code
class foo:
def __init__(self, name, i, j):
self.name = name
self.i = i
self.j = j
def __hash__(self):
return hash((self.name, self.i, self.j))
bar1 = foo('test', 1, 2)
bar2 = foo('test', 1, 2)
my_dict = {bar1: 'bar'}
print(bar1 in my_dict) # True
print(bar2 in my_dict) # False
print(hash(bar1) == hash(bar2)) # True
code
有人可以解释这种行为吗?我希望哈希值也可用于确定字典中是否包含对象。
在 Windows 10 上的 Python 3.12.2 上运行
正如注释中所拼写的,为了使类的实例能够用作字典键或集合成员,它必须同时实现
__hash__
和 __eq__
方法。
只要这样做,它就会如你所期望的那样工作。
class foo:
def __init__(self, name, i, j):
self.name = name
self.i = i
self.j = j
def __hash__(self):
return hash((self.name, self.i, self.j))
def __eq__(self, other):
if not isinstance(other, type(self)):
return False
return self.name == other.name and self.i == other.i and self.j == other.j