Python:使用可散列对象访问dict失败



我正在使用一个可散列对象作为字典的键。这些对象是可散列的,我可以将键值对存储在dict中,但当我创建同一对象的副本(给我相同的散列(时,我会得到KeyError

下面是一些小的示例代码:

class Object:
def __init__(self, x): self.x = x
def __hash__(self): return hash(self.x)
o1 = Object(1.)
o2 = Object(1.)
hash(o1) == hash(o2) # This is True
data = {}
data[o1] = 2.
data[o2] # Desired: This should output 2.

在我上面的场景中,如何实现data[o2]也返回2.

您需要同时实现__hash____eq__:

class Object:
def __init__(self, x): self.x = x
def __hash__(self): return hash(self.x)
def __eq__(self, other): return self.x == other.x if isinstance(other, self.__class__) else NotImplemented

根据Python文档:

如果一个类没有定义__eq__()方法,它就不应该定义__hash__()操作或者

在找到哈希后,Python的字典使用__eq__比较键,并意识到它们是不同的,这就是为什么你没有得到正确的输出。

您可以使用__eq__魔术方法在对象上实现相等性检查。

def __eq__(self, other):
if (isinstance(other, C)):
return self.x == self.x

你可以从这个链接了解更多关于魔术的方法。

如前所述,您的对象需要实现__eq__trait(equity==(,如果您想了解原因:

有时不同对象的散列是相同的,这称为冲突。Dictionary通过测试对象是否相等来管理它。如果它们不是字典,则必须管理冲突。他们是如何做到这一点的,这是实现的细节,可能会有很大的差异。一个伪实现将是元组键值的列表。

在引擎盖下,一个伪实现可能看起来像这样:

dico[key] = [(object1, value), (object2, value)]

最新更新