我正试图写一本可理解的字典:
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__一致工作的__hash__方法,但这并不能解决这个问题:
def __eq__(self, other):
return frozenset(self.items()) == frozenset(other.items())发布于 2021-10-28 09:17:42
集合构造函数以一个可迭代参数作为参数,并创建一个由所有迭代元素组成的集合。由于迭代一个dict只迭代这些键,所以您可以得到它的一组键:
set(x) # takes x and turns it into a set!但是,您需要一个包含set 的 x。
set([x]) # takes a list containing x and turns it into a set
# {x} # is the equivalent请注意,{x}和set(x)是不一样的,没有x类型的!
还请参阅What is the difference between a list of a single iterable list(x) vs [x]?和与此“集合文字与构造函数”相关的许多其他副本。
https://stackoverflow.com/questions/69751312
复制相似问题