我最近遇到了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
?
答案 0 :(得分:7)
在Python 2.7中,dict.keys
返回一个键列表,a2 in d.keys()
将线性迭代所有键,以查找列表中是否有a2
。
但a2 in d
只是在字典中根据对象a2
的哈希值进行O(1)查找,以查看密钥a2
是否在{ {1}}。
但在你的情况下,问题完全不同。引用official documentation,
如果某个类未定义
d
或__cmp__()
方法,则不应定义__eq__()
操作; 如果它定义__hash__()
或__cmp__()
但不定义__eq__()
,则其实例将无法在散列集合中使用。如果类定义了可变对象并实现了{{ 1}}或__hash__()
方法,它不应该实现__cmp__()
,因为hashable集合实现要求对象的散列值是不可变的(如果对象的散列值改变,它将在错误的散列桶中)
由于您尚未明确定义__eq__()
函数,因此您违反了它们之间的契约,__hash__()
使用基于对象的id
的默认哈希值,这将是不同的适用于__hash__
和__hash__
。因此,即使a1
和a2
相似,哈希对象也会将它们视为两个不同的对象,因为它们的哈希值不同。
要解决此问题,您需要定义a1
功能,如此
a2