笔记摘抄自《流畅的Python》
最近看《流畅的Python》,书中多次提到了可散列的数据类型这一概念。
在Python词汇表中,关于可散列类型的定义有这样一段话:
“如果一个对象是可散列的,那么在这个对象的生命周期中,它的散列值是不变的,而且这个对象需要实现 __hash__() 方法。另外可散列对象还要有 __eq__() 方法,这样才能跟其他键做比较。如果两个可散列对象是相等的,那么它们的散列值一定是一样的…”
原子不可变数据类型(str、bytes和数值类型)都是可散列类型,frozenset也是可散列的,因为根据其定义,frozenset里只能容纳可散列类型。对于元组,只有当一个元组包含的所有元素都是可散列类型的情况下,它才是可散列的。
一般来讲,用户自定义的类型的对象都是可散列的,散列值就是它们的id()函数的返回值,所以所有这些对象在比较的时候都是不相等的。如果一个对象实现了__eq__方法,并且在方法中用到了这个对象的内部状态的话(重写的eq方法可能比较的是对象中成员变量的值而不是id函数返回的内存地址),那么只有当所有这些内部状态都是不可变的情况下,这个对象才是可散列的。