【发布时间】:2023-11-13 05:52:01
【问题描述】:
我试图了解 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 如何拥有多个具有相同哈希的元素。
【问题讨论】:
-
正如您自己发现的那样,如果对象本身不相等,集合和字典可以包含多个具有相等哈希值的对象。你在问什么?桌子是如何工作的?这是一个非常普遍的问题,有很多现有材料......
-
@delnan 我在发布问题后正在考虑更多关于这个问题;这种行为不能仅限于 Python。你是对的。我想我应该更深入地研究一般的哈希表文献。谢谢。
标签: python hash dictionary set equality