Я пытаюсь понять hash
функцию Python под капотом. Я создал собственный класс, все экземпляры которого возвращают одно и то же значение хеш-функции.
class C:
def __hash__(self):
return 42
Я просто предположил, что только один экземпляр вышеуказанного класса может быть в a dict
в любое время, но на самом деле a 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
Поэтому мне любопытно узнать, как у a dict
может быть несколько элементов с одним и тем же хешем.