什么是可哈希的
文章目錄
在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方法), 相等的对象哈希值一定相等,那么这个对象就是可哈希的。
也就是说,可哈希对象必须满足下面三个条件
- 支持hash函数,也就是实现hash方法。这个方法的返回值在对象的生命周期里永远不变
- 支持相等判断,也就是实现eq方法
- 如果a == b, 那么hash(a)一定等于hash(b),也就是相等的对象,哈希值一定相等。
这里不明白的是第三点,也就是为什么两个对象相等,哈希值一定要相等,不相等难道不行吗?
下面编写的一个测试类
1 | class UnHashable(object): |
如果我们执行
1 | d = dict() |
之后我们会希望d[b]返回4,但是并不会如此,因为hash[a]并不一定等于hash[b]. 这就是为什么要求可哈希对象一定要a == b时,hash(a) == hash(b)
在Python中,对于内置不可变对象,都是可哈希的,而字典和列表等可变对象不是可哈希的。