dict&和key之间有什么区别?键入dict.keys()?

时间:2016-01-13 01:14:10

标签: python python-2.7 dictionary key

我最近遇到了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

1 个答案:

答案 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__。因此,即使a1a2相似,哈希对象也会将它们视为两个不同的对象,因为它们的哈希值不同。

要解决此问题,您需要定义a1功能,如此

a2
相关问题