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__(默认比较引用,不同实例的引用总是不同)