为什么Python集合不可哈希?
我偶然看到一篇博客,里面讲了怎么在Python中实现一个幂集函数。于是我也试着自己做了一下,结果发现Python似乎不支持集合的集合,因为集合是不可哈希的。这让我有点烦,因为幂集的定义就是一个集合的集合,而我想用真正的集合操作来实现它。
>>> set([ set() ])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
那么,Python的集合为什么不可哈希呢?
4 个回答
21
来自Python文档:
可哈希性
一个对象如果是可哈希的,意味着它有一个在整个生命周期内都不会改变的哈希值(这需要有一个hash()方法),并且可以和其他对象进行比较(这需要有一个eq()或cmp()方法)。那些比较相等的可哈希对象必须有相同的哈希值。可哈希性使得一个对象可以用作字典的键和集合的成员,因为这些数据结构在内部使用哈希值。
Python中所有不可变的内置对象都是可哈希的,而可变的容器(比如列表或字典)则不是。用户自定义类的实例默认是可哈希的;它们之间比较时总是不相等,并且它们的哈希值就是它们的id()。
36
因为它们是可变的。
如果它们是可以哈希的,那么哈希值可能会在不知不觉中变得“无效”,这样一来,哈希的意义就没了。
169
一般来说,在Python中,只有不可变的对象才能被哈希。不可变的集合类型 set()
的一种不可变版本叫做 frozenset()
,它是可以被哈希的。