在Python中,可散列指的是什么
Python是一门强大而灵活的编程语言,它提供了多种内置的数据类型,如数值、字符串、列表、元组、字典和集合等。这些数据类型有着不同的特性和用途,其中一个重要的区别就是是否可散列(hashable)。那么什么是可散列的数据类型呢?为什么需要可散列的数据类型呢?Python在哪些情况下利用了可散列的数据类型呢?本文将对这些问题进行探讨。
什么是可散列
在Python词汇表中,关于可散列类型的定义有这样一段话:
如果一个对象是可散列的,那么在这个对象的生命周期中,它的散列值是不变的,而且这个对象需要实现
__hash__()
方法。另外可散列对象还要有__eq__()
方法,这样才能跟其他键做比较。如果两个可散列对象是相等的,那么它们的哈希值必须相等。
简单来说,就是一个对象如果能够通过内置函数 hash()
得到一个固定且唯一(尽可能地)的整数值,并且能够通过 ==
运算符判断相等性,那么它就是可散列的。例如:
>>> x = 42 # 整数是不可变且支持相等性判断的
>>> hash(x) # 可以得到一个整数值
42
>>> x == 42 # 可以判断相等性
True
>>> y = "hello" # 字符串也是不可变且支持相等性判断的
>>> hash(y) # 可以得到一个整数值
-3645514851047060381
>>> y == "hello" # 可以判断相等性
True
反之,如果一个对象不能满足上述条件,那么它就是不可散列的。例如:
>>> z = [1, 2, 3] # 列表是可变且支持相等性判断的
>>> hash(z) # 不可以得到一个整数值
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> z == [1, 2, 3] # 可以判断相等性
True