python tips:作为dict的key的类

Python的dict由hash实现,解决hash冲突的方法是二次探查法。hash值相同的元素会形成链表。所以dict在查找key时,首先获取hash值,直接得到链表的表头;而后在链表中查找等于key的值。

所以要使一个对象的实例能够作为dict的key值,一般需要实现__hash__和__eq__两个方法。

没有实现__eq__方法的类的实例总是不相等(引用总是不同)

 1 class A:
 2     def __hash__(self):
 3         return 2
 4 
 5 a = A()
 6 b = A()
 7 d = {a:0}
 8 if b in d:
 9     print(d[b])
10 else:
11     print("b is not in d")

输出结果

1 b is not in d

可以用于key的实例

 1 class A:
 2     def __hash__(self):
 3         return 2
 4     
 5     def __eq__(self, other):
 6         return True
 7 
 8 a = A()
 9 b = A()
10 d = {a:0}
11 if b in d:
12     print(d[b])
13 else:
14     print("b is not in d")

输出结果

1 0

总结:

1. 要作为dict的key,需要能够求hash值(key为不可变对象),需要能比较(是否相等)

2. 对于类来说,实例求hash需要实现__hash__,比较是否相等需要实现__eq__(默认比较引用,不同实例的引用总是不同)

 

posted @ 2019-06-13 19:13  luoheng  阅读(644)  评论(0编辑  收藏  举报