Python 为什么可以';我不能做一套清单吗?

Python 为什么可以';我不能做一套清单吗?,python,Python,当我尝试以下代码时: frozenset([[]]) 我明白了 回溯(最近一次呼叫最后一次): 文件“---.----.py”,第1行,在 冻结集([[])类型错误:不可损坏的类型:“列表” 为什么我不能这样做?因为列表是可变的,它们的值可以更改 您需要不可变的对象,如字符串或元组等 如果一个对象的值改变,它的散列值也会改变 Brandon Rhodes很好地解释了Python中哈希如何与字典相关,因为列表是可变的,它们的值可以更改 您需要不可变的对象,如字符串或元组等 如果一个对象的值改

当我尝试以下代码时:

frozenset([[]])
我明白了

回溯(最近一次呼叫最后一次):
文件“---.----.py”,第1行,在
冻结集([[])类型错误:不可损坏的类型:“列表”

为什么我不能这样做?

因为
列表是可变的,它们的值可以更改

您需要
不可变的
对象,如字符串或元组等

如果一个对象的值改变,它的散列值也会改变


Brandon Rhodes很好地解释了Python中哈希如何与字典相关,因为
列表是可变的,它们的值可以更改

您需要
不可变的
对象,如字符串或元组等

如果一个对象的值改变,它的散列值也会改变

Brandon Rhodes对Python中的哈希如何与Python中的字典相关给出了非常好的解释。作为:

如果一个对象的哈希值在其生存期内从不改变(它需要一个哈希()方法),并且可以与其他对象进行比较(它需要一个eq()方法),则该对象是可哈希的。比较相等的可散列对象必须具有相同的散列值

这是因为集合需要能够高效地执行集合操作并快速确定某个项是否在集合中(通过比较哈希值)。因为列表是可变的,不可散列的,所以它们不能放在一个集合中

在你的代码中,如果你说
frozenset([])
,那就好了。在本例中,您正在创建
[]
中项目的
冻结集
,这些项目都应该是可散列的(因为列表中没有任何项目,所以可散列性不是问题)。但是,当您说
frozenset([[]])
时,Python会尝试创建外部列表中所有项的
frozenset
;但是外部列表中的第一项是另一个不可散列的列表(
[]
);因此,您将得到一个错误。

在Python中。作为:

如果一个对象的哈希值在其生存期内从不改变(它需要一个哈希()方法),并且可以与其他对象进行比较(它需要一个eq()方法),则该对象是可哈希的。比较相等的可散列对象必须具有相同的散列值

这是因为集合需要能够高效地执行集合操作并快速确定某个项是否在集合中(通过比较哈希值)。因为列表是可变的,不可散列的,所以它们不能放在一个集合中

在你的代码中,如果你说
frozenset([])
,那就好了。在本例中,您正在创建
[]
中项目的
冻结集
,这些项目都应该是可散列的(因为列表中没有任何项目,所以可散列性不是问题)。但是,当您说
frozenset([[]])
时,Python会尝试创建外部列表中所有项的
frozenset
;但是外部列表中的第一项是另一个不可散列的列表(
[]
);所以你会得到一个错误

Traceback (most recent call last):
   File "-----.-----.py", line 1, in <module>
    frozenset([[]]) TypeError: unhashable type: 'list'