Tôi đang cố gắng hiểu hash
hàm Python dưới mui xe. Tôi đã tạo một lớp tùy chỉnh nơi tất cả các phiên bản trả về cùng một giá trị băm.
class C:
def __hash__(self):
return 42
Tôi chỉ giả định rằng chỉ có một thể hiện của lớp trên có thể dict
ở bất kỳ lúc nào, nhưng trên thực tế, a dict
có thể có nhiều phần tử với cùng một hàm băm.
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
Tôi đã thử nghiệm nhiều hơn một chút và nhận thấy rằng nếu tôi ghi đè __eq__
phương thức sao cho tất cả các trường hợp của lớp so sánh bằng nhau, thì dict
chỉ cho phép một trường hợp.
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
Vì vậy, tôi tò mò muốn biết làm thế nào một dict
có thể có nhiều phần tử với cùng một hàm băm.