Hashable(可哈希)
基础概念:
在编程中,特别是Python等语言里,“可哈希”(hashable)是指一个对象具有不可变性,并且能够返回一个整数哈希值,该哈希值在其生命周期内保持不变。这使得该对象可以用作字典的键或集合的元素。
相关优势:
类型:
在Python中,一些常见的可哈希类型包括字符串、数字(整数和浮点数,但需要注意浮点数的精度问题)、元组(当其元素也都是可哈希的时)等。而列表、字典和集合等则是不可哈希的。
应用场景:
遇到的问题及解决方法:
问题:为什么自定义对象默认是不可哈希的?
原因:自定义对象默认是可变的(除非显式声明为不可变),并且它们的哈希值是基于它们的id(内存地址)计算的,这意味着每次创建新对象时,即使它们的内容相同,它们的哈希值也会不同。
解决方法:要使自定义对象可哈希,需要实现__hash__
和__eq__
方法。__hash__
方法应返回一个整数哈希值,而__eq__
方法应定义对象之间的相等性比较。同时,为了确保对象是不可变的,应避免在对象创建后修改其状态。
示例代码(Python):
class Person:
def __init__(self, name, age):
self._name = name
self._age = age
@property
def name(self):
return self._name
@property
def age(self):
return self._age
def __hash__(self):
return hash((self.name, self.age))
def __eq__(self, other):
if isinstance(other, Person):
return self.name == other.name and self.age == other.age
return False
# 使用示例
p1 = Person("Alice", 30)
p2 = Person("Alice", 30)
print(hash(p1)) # 输出一个整数哈希值
print(p1 == p2) # 输出True,因为p1和p2的内容相同
在这个示例中,Person
类实现了__hash__
和__eq__
方法,使其成为可哈希对象。同时,通过使用@property装饰器将属性设置为只读,确保了对象的不可变性。
领取专属 10元无门槛券
手把手带您无忧上云