在 Python 中,可哈希对象(Hashable Objects)是指那些可以通过 hash()
函数计算出一个哈希值的对象,并且这些对象的哈希值在它们的生命周期内是不变的。换句话说,可哈希对象必须是不可变(immutable)的,因为它们的哈希值必须保持一致。
常见的可哈希对象包括大多数内置的不可变数据类型,例如:
- 字符串(
str
) - 数字(
int
、float
、complex
) - 元组(
tuple
),只要元组中的所有元素也都是可哈希对象 - 冻结集合(
frozenset
) - 某些自定义的不可变类实例
为什么字典的键必须是可哈希对象呢?这与字典的工作原理有关。字典(dict
)是一种基于散列表(hash table)的实现。在散列表中,数据通过散列函数(hash function)被映射到一个固定大小的数组中的某个位置。这个过程称为散列(hashing)。
字典的键通过 hash()
函数计算出一个哈希值,这个哈希值决定了键值对在字典中的存储位置。当查找键值对时,字典会使用相同的散列函数来找到键对应的位置,然后检查该位置是否包含正确的键。
由于字典需要能够快速地定位和访问键值对,因此它依赖于键的不可变性和哈希值的一致性。如果键是可变的,那么它的哈希值可能会改变,这将导致字典无法正确地定位键值对,因为一个键可能会对应多个不同的位置,或者在字典中的位置会随着键的变化而变化。
此外,字典中的键必须是唯一的。如果两个不同的键具有相同的哈希值,这称为哈希冲突。
因此,为了确保字典的高效操作和数据完整性,字典的键必须是可哈希的,即它们必须是不可变对象。
集合(set)在 Python 中是一种无序的、不重复的元素集。它是基于散列(hashing)原理来存储元素的,这与字典的键的存储方式类似。在集合中,每个元素都需要通过散列函数来确定其在内部数据结构中的位置。
由于集合不允许重复的元素,它需要能够快速检查一个元素是否已经存在于集合中。为了实现这一点,集合使用元素的哈希值来进行快速查找和比较。集合中存储的元素必须是可哈希的,那么它们的哈希值是唯一的并且在整个生命周期内不会改变,这使得集合可以有效地利用散列表来存储和检索元素。