我最近在使用python 2.7时遇到了一个问题:
class A(object):
def __init__(self, v):
self.v = v
def __eq__(self, other):
return self.v == other.v
a1 = A(1)
a2 = A(1)
所以:
print a1 == a2 # True
以及:
d = {a1: 1}
print a2 in d.keys() # True
但是:
print a2 in d # False
问题是a2 ind.keys()
和a2 in d
之间的主要区别是什么?如何获得a2 in d is True
?你知道吗
在Python2.7中,
dict.keys
返回一个键列表,a2 in d.keys()
将线性迭代所有键,以确定a2
是否在列表中。你知道吗但是
a2 in d
将根据对象a2
的散列值在字典中执行O(1)查找,以查看键a2
是否在d
。你知道吗但在你的情况下,问题是完全不同的。引用official documentation
因为您没有显式定义} 的默认哈希,这对于
__hash__
函数,所以您正在破坏它们之间的契约,__hash__
使用基于对象的^{a1
和a2
都是不同的。因此,即使a1
和a2
是相似的,散列对象也会将它们视为两个不同的对象,因为它们的散列值是不同的。你知道吗要解决这个问题,需要定义
__hash__
函数,如下所示相关问题 更多 >
编程相关推荐