我试图理解底层的 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'}
# note that the dict has 2 elements
我进行了更多的实验,发现如果我重写 __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'}
# note that the dict only has 1 element
因此,我很好奇 dict
如何能够有多个具有相同散列的元素。