首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >集合的第一个字典元素神秘地变成一个整数。

集合的第一个字典元素神秘地变成一个整数。
EN

Stack Overflow用户
提问于 2021-10-28 09:13:22
回答 1查看 50关注 0票数 0

我正试图写一本可理解的字典:

代码语言:javascript
运行
复制
class HashableDict(dict):
    def __hash__(self):
        return hash(frozenset(self.items()))

然而,这会导致一种意想不到的行为。如果我创建一个这样的集合:

代码语言:javascript
运行
复制
x = HashableDict({0: 1})
y = HashableDict({0: 2})
print(set((x, y)))

正如预期的那样,这将打印{{0: 1}, {0: 2}}。但是,如果我创建以下集合:

代码语言:javascript
运行
复制
x = HashableDict({0: 1})
print(set(x))

Python3.9打印{0}。如果我使用{x} (即打印{0: 1} ),则不会发生这种情况。要增加谜团,请使用以下代码:

代码语言:javascript
运行
复制
A = set(x)
A.add(y)
print(A)

打印{0, {0: 2}}。所以这只发生在片场的第一个元素..。

我做错了什么?请注意,我还尝试添加一个与__hash__一致工作的__hash__方法,但这并不能解决这个问题:

代码语言:javascript
运行
复制
def __eq__(self, other):
    return frozenset(self.items()) == frozenset(other.items())
EN

Stack Overflow用户

发布于 2021-10-28 09:17:42

集合构造函数以一个可迭代参数作为参数,并创建一个由所有迭代元素组成的集合。由于迭代一个dict只迭代这些键,所以您可以得到它的一组键:

代码语言:javascript
运行
复制
set(x) # takes x and turns it into a set!

但是,您需要一个包含set x

代码语言:javascript
运行
复制
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]?和与此“集合文字与构造函数”相关的许多其他副本。

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69751312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档