Estoy tratando de entender la hash
función de Python bajo el capó. Creé una clase personalizada donde todas las instancias devuelven el mismo valor hash.
class C:
def __hash__(self):
return 42
Simplemente asumí que solo una instancia de la clase anterior puede estar en a dict
en cualquier momento, pero de hecho a dict
puede tener múltiples elementos con el mismo hash.
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
Experimenté un poco más y descubrí que si anulo el __eq__
método de manera que todas las instancias de la clase se comparen de la misma manera, entonces la dict
única permite una instancia.
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
Así que tengo curiosidad por saber cómo se dict
pueden tener varios elementos con el mismo hash.