一、介绍
在Python中,可哈希(hashable)是指一种对象类型,该类型的对象可以用作字典的键(keys)或集合(sets)的元素。可哈希的对象具有以下特点:
-
不可变性(Immutable): 可哈希的对象必须是不可变的,即创建后不能被修改。这确保了哈希值的稳定性,因为哈希值是根据对象的内容计算得出的。
-
具有哈希函数: 可哈希对象需要具有一个哈希函数(hash function),这个函数将对象映射到一个唯一的整数,即哈希值。这个哈希值用于在字典或集合中快速查找或比较对象。
二、 可哈希对象与不可哈希的对象
不可哈希的对象包括列表、集合和字典等可变对象,因为它们可以在创建后修改。而字符串、元组等不可变对象是可哈希的。
以下是一些常见的可哈希对象类型:
- 整数(int)
- 浮点数(float)
- 字符串(str)
- 元组(tuple)
- 冻结集合(frozenset)
例如,以下是一些可哈希的对象:
# 整数、浮点数、布尔值都是不可变类型的对象,因此都是可哈希的
42
3.14
True
# 字符串和元组都是不可变类型的对象,因此都是可哈希的
"hello"
(1, 2, 3)
# frozenset是不可变类型的集合,因此是可哈希的
frozenset([1, 2, 3])
而以下对象则不是可哈希的:
# 列表是可变类型的对象,因此不是可哈希的
[1, 2, 3]
# 集合也是可变类型的对象,因此不是可哈希的
set([1, 2, 3])
# 字典是可变类型的对象,因此不是可哈希的
{"name": "Alice", "age": 30}
需要注意的是,自定义的类实例默认是可哈希的,但这取决于类的实现。如果类没有正确实现 __hash__()
方法和 __eq__()
方法,那么实例可能不会按预期工作。为了确保自定义类的实例是可哈希的,你需要实现这些方法。
三、__hash__()
和 __eq__()
__hash__()
方法是一个对象的特殊方法,用于返回该对象的哈希值。哈希值是一个整数,用于表示对象的唯一标识。相等的对象必须具有相同的哈希值。如果一个对象没有实现__hash__()
方法,那么它就不能被用作字典的键或集合的成员。
__eq__()
方法是一个对象的特殊方法,用于比较两个对象是否相等。如果一个对象没有实现__eq__()
方法,那么它就不能被用作集合的成员,因为集合需要比较成员对象的相等性。
示例
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __hash__(self):
return hash((self.name, self.age))
def __eq__(self, other):
return (self.name, self.age) == (other.name, other.age)
p1 = Person("Alice", 30)
p2 = Person("Alice", 30)
print(p1 == p2) # 输出 True
print(hash(p1))
print(hash(p2))
在该示例中,Person
类实现了__hash__()
方法和__eq__()
方法,用于比较两个Person
对象的相等性。__hash__()
方法返回一个包含姓名和年龄的元组的哈希值,而__eq__()
方法比较两个对象的姓名和年龄是否相等。因此,两个姓名和年龄相同的对象具有相同的哈希值。
参考:
【Python面向对象编程】第13篇 特殊方法之__hash___不剪发的Tony老师的博客-CSDN博客
Python:__eq_和__str__函数的用法___eq___Python 学习者的博客-CSDN博客