为什么不能将集合作为集合的元素? [重复] - python

This question already has answers here:

How can I create a Set of Sets in Python?

(5个答案)

5年前关闭。

在集合内创建{{2}, 3, 4}集合元素时出现错误。

错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'

有其他替代方法吗?
提前致谢。

python大神给出的解决方案

通常,在Python中,诸如set之类的可变类型不是hashable。它们不能用作set元素或dict键并不只是一个巧合,这实际上是重点:

如果对象的哈希值在其生命周期内从未改变(需要__hash__()方法),并且可以与其他对象进行比较(需要__eq__()方法),则该对象是可哈希的。比较相等的可哈希对象必须具有相同的哈希值。

散列性使对象可用作字典键和set成员,因为这些数据结构在内部使用散列值。

Python的所有不可变内置对象都是可哈希的,而没有可变容器(例如列表或字典)是可哈希的。作为用户定义类实例的对象默认情况下可哈希化;它们都比较不相等(除了它们自己),并且它们的哈希值是从id()派生的。

frozenset类型主要用于此目的:

当前有两种内置集类型,setfrozensetset类型是可变的-可以使用add()remove()之类的方法更改内容。由于它是可变的,因此它没有哈希值,因此不能用作字典键或另一个集合的元素。 frozenset类型是不可变的和可哈希的-创建后不能更改其内容;因此,它可以用作字典键或用作另一个集合的元素。