为什么Python字典可以有多个具有相同哈希值的键?

12 浏览
0 Comments

为什么Python字典可以有多个具有相同哈希值的键?

我正在尝试理解Python中的hash函数的内部工作原理。我创建了一个自定义类,其中所有实例返回相同的哈希值。

class C:
    def __hash__(self):
        return 42

我只是假设上述类的实例在dict中一次只能有一个,但实际上dict可以有多个具有相同哈希值的元素。

c, d = C(), C()
x = {c: 'c', d: 'd'}
print(x)
# {<__main__.C object at 0x7f0824087b80>: 'c', <__main__.C object at 0x7f0823ae2d60>: 'd'}
# 注意,dict有2个元素

我进一步进行了一些实验,发现如果我重写__eq__方法,使得该类的所有实例都比较相等,那么dict只允许一个实例。

class D:
    def __hash__(self):
        return 42
    def __eq__(self, other):
        return True
p, q = D(), D()
y = {p: 'p', q: 'q'}
print(y)
# {<__main__.D object at 0x7f0823a9af40>: 'q'}
# 注意,dict只有1个元素

所以我很好奇如何让dict具有相同哈希值的多个元素。

0