什么是可散列的数据类型

什么是可散列的数据类型

 在Python词汇表(https://docs.python.org/3/glossary.html#term-hashable)中,关于可散列类型的定义有这样一段话: 如果一个对象是可散列的,那么在这个对象的生命周期中,它的散列值是不变  的,而且这个对象需要实现__hash__()方法。另外可散列对象还要有__eq__()方法,这样
 才能跟其他键做比较。如果两个可散列对象是相等的,那么它们的散列值一定是一样的
原子不可变数据类型(str、bytes和数值类型)都是可散列类型,frozenset也是可散列的,因为根据其定义,frozenset里只能容纳可散列类型。元组的话,只有当一个元组包含所有元素都是可散列类型的情况下,他才是可散列的。看下面的元组tt、tl和tf:

tt=(1,2,(30,40))
hash(tt)
-3907003130834322577
tl=(1,2,[30,40])
hash(tl)
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

~\AppData\Local\Temp/ipykernel_6072/2193043786.py in <module>
      1 tl=(1,2,[30,40])
----> 2 hash(tl)


TypeError: unhashable type: 'list'
tf=(1,2,frozenset([30,40]))
hash(tf)
5149391500123939311

一般来讲,用户自定义的类型的对象都是可散列的,散列值就是他们的id()函数的返回值,所以所有这些对象在比较的时候都是不相等的。如果一个对象实现了__eq__方法,并且在方法中用到了这个对象的内部状态的话,那么只有当所有这些内部状态都是不可变的情况下,这个对象才是可散列的。

posted @ 2021-09-19 09:31  里列昂遗失的记事本  阅读(151)  评论(0编辑  收藏  举报