首页 > 解决方案 > Python中的哈希性和不变性疑问

问题描述

抱歉,如果以前有人问过这个问题,但我自己无法回答。我正在尝试学习 Python,同时我正在探索sets不能包含可变对象的想法。list我使用inside a尝试了不同的场景,并达到了将 a inside a放入seta 的地步,得到以下结果:listtupleset

a = ([1,2,3],)
type(a)
<class 'tuple'>
S = {1,2,3,a}
Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    S = {1,2,3,a}
TypeError: unhashable type: 'list'
c = ((1,2,3),)
type(c)
<class 'tuple'>
S = {1,2,3,c}
>>> S
{1, 2, 3, ((1, 2, 3),)}

所以ac都是,tuples但其中一个在 (a) 内部具有不可散列list的类型。所以,我认为更好的说法sets是它们不能包含不可散列的对象。tuple无论如何,我的疑问是,就知道在这种情况下哪个在 a 中使用是有效的而言,这个过程对于 python 是如何发生的set

谢谢大家,SP

标签: pythonlistsetimmutability

解决方案


集合要求它们的元素是可散列的。所以,可变类型是不可散列的,因为它们的值的改变会改变散列,进而破坏散列的整个属性。

注意: 如果您明确定义__hash__(),那么您也可以为不可变类型做。


推荐阅读