为什么集合不将元组(其中字典是项)作为键?

Why is a set not taking tuple (where dictionary is an item) as a key?

提问人:Yogesh 提问时间:1/23/2022 最后编辑:Yogesh 更新时间:1/24/2022 访问量:519

问:

我知道集合键是不可变的,因此像列表这样的数据类型没有资格成为集合中的键。在下面显示的示例中,如果元组内存在字典中,为什么元组不能用作键?有人可以帮我解释一下吗?

x= (1,{'a':1})
y= (1,2)
print(type(x),type(y))

# piece of code which is not giving me an error is below
set1 = {x,'INDIA'}

# set 2 can be created in similar manner without an error
set2 = {y,'INDIA'}

set2
字典 设置 元组 可变

评论

1赞 martineau 1/23/2022
集合中的所有项目都必须是可哈希的,而字典则不是(它们的元组也不是)。

答:

0赞 Adam.Er8 1/23/2022 #1

如果可能的话,想想这种情况:
is 指的是 dict,它是一个可变的对象。
如果程序中的其他地方有人引用了该词典并对其进行了修改,那么下次使用时,它将具有“不同的值”(例如,将不再属于该集合)。
x[1]x

x = (1, {'a':1})
print(x)
x[1]['a'] = 'BANANA'
print(x)

输出:

(1, {'a': 1})
(1, {'a': 'BANANA'})

评论

0赞 Yogesh 1/23/2022
x 是一个元组,因此是不可变的。其中包含可变项并不会使其可变。stackoverflow.com/questions/9755990/......
0赞 Adam.Er8 1/24/2022
@Yogesh是的,这是真的,总是一样的,改变我的措辞,简单地说明为什么这是一个问题,如果它被允许的话。x[1]x[1]
0赞 dshin 1/23/2022 #2

只有当 的所有元素都可以用作键时,A 才能用作键。A 不能用作键(因为它是可变的)。tupletupledict

这里更技术性的答案是,键必须是可散列的,并且只有当它们的各个元素是可散列的时,s 才是可散列的。dicttuple