Python 基础教程

Python 流程控制

Python 函数

Python 数据类型

Python 文件操作

Python 对象和类

Python 日期和时间

Python 高级知识

Python 参考手册

Python hash() 使用方法及示例

Python 内置函数

hash()方法返回一个对象的哈希值(如果有)。

哈希值只是一些整数,在字典查找过程中用来比较字典键。

在内部,hash()方法调用__hash__()对象的方法,该方法默认情况下为任何对象设置。我们稍后再看这个。

hash()方法的语法为:

hash(object)

hash()参数

hash()方法采用一个参数:

  • object -要返回其哈希值的对象(整数,字符串,浮点数)

hash()返回值

hash()方法返回一个对象的哈希值(如果有)。

如果对象具有自定义__hash__()方法,则它将返回值截断为Py_ssize_t的大小。

示例1:hash()如何在Python中工作?

# 整数的哈希值保持不变
print('181的哈希是:', hash(181))

# 十进制哈希
print('181.23的哈希为:',hash(181.23))

# 字符串哈希
print('Python的哈希为:', hash('Python'))

运行该程序时,输出为:

181的哈希是: 181
181.23的哈希为: 579773580
Python的哈希为: 2101984854

示例2:不可变元组对象的hash()?

hash()方法仅适用于不可变对象,如tuple

# 元音元组
vowels = ('a', 'e', 'i', 'o', 'u')

print('hash是:', hash(vowels))

运行该程序时,输出为:

hash是: -695778075465126279

hash()如何用于自定义对象?

如上所述,hash()方法在内部调用__hash__()方法。因此,任何对象都可以覆盖__hash __()以获得自定义哈希值。

但是对于正确的哈希实现,__ hash __()应该始终返回整数。并且,必须同时实现__eq __()和__hash __()方法。

下面是正确的__hash __()重写的情况。

对象的自定义哈希实现的案例
__eq __()__hash __()描述

已定义(默认情况下)

已定义(默认情况下)

如果保持原样,所有对象的比较都是不相等的(除了它们自己)

(如果可变)已定义

不应该定义

实现hashable集合需要键的散列值是不可变的

没有定义不应该定义如果未定义__eq __(),则不应定义__hash __()。
已定义没有定义

类示例将不能用作可哈希收集。

__hash __()隐式设置为None

如果尝试检索哈希,则引发TypeError异常。

已定义保留从父类__hash__ = <ParentClass> .__ hash__
已定义不散列

__hash__ =None

如果尝试检索哈希,则引发TypeError异常。

示例3:通过重写__hash __()的自定义对象的hash()

class Person:
    def __init__(self, age, name):
        self.age = age
        self.name = name

    def __eq__(self, other):
        return self.age == other.age and self.name == other.name

    def __hash__(self):
        print('hash是:')
        return hash((self.age, self.name))

person = Person(23, 'Adam')
print(hash(person))

运行该程序时,输出为:

hash是:
3785419240612877014

注意:您不必为哈希实现__eq __()方法,因为默认情况下会为所有对象创建哈希。

Python 内置函数