English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

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__ ()Описание

Определено (по умолчанию)

Определено (по умолчанию)

Если оставить без изменений, все объекты будут сравниваться как не равные (кроме самих себя)

(Если изменяемые) Определено

Не следует определять

Для реализации хэшируемого набора значения хэша ключа должны быть неизменными

Не определеноНе следует определятьЕсли не определено __eq__ (), не следует определять __hash__ ()
ОпределеноНе определено

Классовые примеры не могут использоваться в хэшируемых собраниях.

__hash__ () импlicitно установлено в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