python的可哈希对象

一、介绍

在Python中,可哈希(hashable)是指一种对象类型,该类型的对象可以用作字典的键(keys)或集合(sets)的元素。可哈希的对象具有以下特点:

  1. 不可变性(Immutable): 可哈希的对象必须是不可变的,即创建后不能被修改。这确保了哈希值的稳定性,因为哈希值是根据对象的内容计算得出的。

  2. 具有哈希函数: 可哈希对象需要具有一个哈希函数(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博客

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值