在Python官方词汇表中,关于hashable类型的定义有这样一段话:
An objectis hashable if it has a hash value which never changes during its lifetime (it needs a hash() method),
and can be compared toother objects (it needs an eq() method).
Hashable objects which compare equal must have the same hash value.
如果一个对象是可散列的,那么在这个对象的生命周期中,他的散列值是不会变的(它需要实现__hash__()方法)。
它可以与其他对象作比较(还需实现__eq__()方法)。
如果一个可散列对象与另一个可散列对象是相等的,那么他们的散列值hash value一定是相等的。
原子不可变数据类型(str,bytes和数值类型)都是hashable类型
frozenset也是hashable的,因为根据其定义,frozenset里只可容纳可散列类型。
注:frozenset()返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。
frozenset()函数语法:class frozenset([iterable])
元组也是hashable的,但只有当元组包含的所有元素都是hashable类型的情况下它才是可散列的。
简单来说,如果一个对象是可散列的数据类型的话,那它应是不可变的。
list等可变对象是不可散列的,因为随着数据的改变他们的哈希值会变化导致进入错误的哈希表。
一般用户自定义的类型的对象都是可散列的,散列值就是它们的id()函数的返回值,所以所有这些对象在比较的时候都是不相等的。如果一个对象实现了__eq__()方法,并且在方法中用到了这个对象的内部状态的话,那么只有当所有这些内部状态都是不可变的情况下,这个对象才是可散列的。
标签:hashable,__,hash,对象,数据类型,frozenset,散列 From: https://www.cnblogs.com/zjw-lxj/p/18137868