【发布时间】:2021-10-28 09:13:22
【问题描述】:
我正在尝试编写一个可散列的字典:
class HashableDict(dict):
def __hash__(self):
return hash(frozenset(self.items()))
但是,这会导致意外行为。如果我创建一个这样的集合:
x = HashableDict({0: 1})
y = HashableDict({0: 2})
print(set((x, y)))
正如预期的那样,这将打印{{0: 1}, {0: 2}}。但是,如果我创建以下集合:
x = HashableDict({0: 1})
print(set(x))
Python3.9 打印 {0}。如果我改用{x}(即打印{0: 1}),则不会发生这种情况。更神秘的是,下面的代码:
A = set(x)
A.add(y)
print(A)
打印{0, {0: 2}}。所以这只发生在集合的第一个元素上......
我做错了什么?请注意,我还尝试添加与__hash__ 一致的__eq__ 方法,但这并不能解决它:
def __eq__(self, other):
return frozenset(self.items()) == frozenset(other.items())
【问题讨论】: