为什么我不能通过Python设置差异?

Mar*_*Lee 2 python set

所以我有几点经验:

>>>{2,3} - {2}
{3}
Run Code Online (Sandbox Code Playgroud)

这一个很完美.

但是,这个似乎不起作用:

>>> {{2,3},{4,3}} - {{4,3}}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
Run Code Online (Sandbox Code Playgroud)

我认为它应该工作,

因为我使用一组包含两个元素,{2,3}和{4,3}到减去一个元素{4,3}.

尽管如此,它无法奏效.为什么?

fal*_*tru 6

sets不可清洗; 不能成为集合的成员.frozenset改为使用:

>>> {frozenset({2,3}), frozenset({4,3})} - {frozenset({4,3})}
set([frozenset([2, 3])])
Run Code Online (Sandbox Code Playgroud)

根据set/ frozenset文件:

集合的元素必须是可以清除的.要表示集合集,内部集合必须是冻结集合对象.如果未指定iterable,则返回新的空集.


可哈希

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

Hashability使对象可用作字典键和set成员,因为这些数据结构在内部使用哈希值.

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