文章目錄

Python词汇表里对,可哈希的有这样一段说明:

An object is hashable if it has a hash value which never changes during its lifetime (it needs a hash() method), and can be compared to other objects (it needs an eq() method). Hashable objects which compare equal must have the same hash value.

也就是说,一个对象的哈希值(实现hash方法)在对象的生命周期里永远不变的,这个对象可以与其它对象进行比较(实现eq方法), 相等的对象哈希值一定相等,那么这个对象就是可哈希的。

也就是说,可哈希对象必须满足下面三个条件

  1. 支持hash函数,也就是实现hash方法。这个方法的返回值在对象的生命周期里永远不变
  2. 支持相等判断,也就是实现eq方法
  3. 如果a == b, 那么hash(a)一定等于hash(b),也就是相等的对象,哈希值一定相等。

这里不明白的是第三点,也就是为什么两个对象相等,哈希值一定要相等,不相等难道不行吗?

下面编写的一个测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class UnHashable(object):
"""
>>> a = UnHashable(3)
>>> b = UnHashable(3)
>>> a == b
True
"""

def __init__(self, x):
self.x = x

def __eq__(self, other):
return self.x == other.x

def __hash__(self):
import random
return hash("{} {}".format(self.x, random.random()))

如果我们执行

1
2
3
4
d = dict()
a = UnHashable(3)
b = UnHashable(3)
d[a] = 4

之后我们会希望d[b]返回4,但是并不会如此,因为hash[a]并不一定等于hash[b]. 这就是为什么要求可哈希对象一定要a == b时,hash(a) == hash(b)

在Python中,对于内置不可变对象,都是可哈希的,而字典和列表等可变对象不是可哈希的。

文章目錄