hash()方法返回一个对象的哈希值(如果有)。
哈希值只是一些整数,在字典查找过程中用来比较字典键。
在内部,hash()方法调用__hash__()对象的方法,该方法默认情况下为任何对象设置。我们稍后再看这个。
hash()方法的语法为:
hash(object)
hash()方法采用一个参数:
object -要返回其哈希值的对象(整数,字符串,浮点数)
hash()方法返回一个对象的哈希值(如果有)。
如果对象具有自定义__hash__()方法,则它将返回值截断为Py_ssize_t的大小。
# 整数的哈希值保持不变 print('181的哈希是:', hash(181)) # 十进制哈希 print('181.23的哈希为:',hash(181.23)) # 字符串哈希 print('Python的哈希为:', hash('Python'))
运行该程序时,输出为:
181的哈希是: 181 181.23的哈希为: 579773580 Python的哈希为: 2101984854
hash()方法仅适用于不可变对象,如tuple。
# 元音元组 vowels = ('a', 'e', 'i', 'o', 'u') print('hash是:', hash(vowels))
运行该程序时,输出为:
hash是: -695778075465126279
如上所述,hash()方法在内部调用__hash__()方法。因此,任何对象都可以覆盖__hash __()以获得自定义哈希值。
但是对于正确的哈希实现,__ hash __()应该始终返回整数。并且,必须同时实现__eq __()和__hash __()方法。
下面是正确的__hash __()重写的情况。
__eq __() | __hash __() | 描述 |
---|---|---|
已定义(默认情况下) | 已定义(默认情况下) | 如果保持原样,所有对象的比较都是不相等的(除了它们自己) |
(如果可变)已定义 | 不应该定义 | 实现hashable集合需要键的散列值是不可变的 |
没有定义 | 不应该定义 | 如果未定义__eq __(),则不应定义__hash __()。 |
已定义 | 没有定义 | 类示例将不能用作可哈希收集。 __hash __()隐式设置为None 如果尝试检索哈希,则引发TypeError异常。 |
已定义 | 保留从父类 | __hash__ = <ParentClass> .__ hash__ |
已定义 | 不散列 | __hash__ =None 如果尝试检索哈希,则引发TypeError异常。 |
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 __()方法,因为默认情况下会为所有对象创建哈希。