类作为字典键无法识别重复项

问题描述 投票:0回答:1

我想使用一个类作为字典键,并实现了 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 上运行

python dictionary hash key
1个回答
0
投票

正如注释中所拼写的,为了使类的实例能够用作字典键或集合成员,它必须同时实现

__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
© www.soinside.com 2019 - 2024. All rights reserved.