为什么我无法对列表进行冻结?

时间:2014-05-17 22:16:30

标签: python

当我尝试以下代码时:

frozenset([[]])

我得到了

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

为什么我不能这样做?

2 个答案:

答案 0 :(得分:4)

在Python中,the elements of set must be hashable。正如Python docs explain

  

如果对象具有在其生命周期内永远不会更改的哈希值(它需要哈希()方法),并且可以与其他对象进行比较(它需要),则该对象是可清除的eq ()方法)。比较相等的Hashable对象必须具有相同的哈希值。

这是因为集合需要能够有效地执行集合操作并快速确定项目是否在集合中(通过比较散列值)。由于列表是可变的而且不可清除,因此它们不能放在一个集合中。

在您的代码中,如果您要说frozenset([]),那就没关系了。在这种情况下,您要在frozenset中创建[]个项目,这些项目都应该是可清除的(因为列表中没有任何项目,因此可以使用hashable-ness)。但是当你说frozenset([[]])时,Python会尝试在外部列表中创建所有项目的frozenset;但外部列表中的第一项是另一个不可清除的列表([]);所以你会收到一个错误。

答案 1 :(得分:1)

因为listsmutable且其值可能会发生变化。

您需要immutable个对象,如字符串或元组等。

如果对象的值发生变化,它的哈希值也会发生变化。

object values and types

Brandon Rhodes对Python中与字典the mighty dictionary

相关的哈希工作方式提供了很好的解释