Python 对象作为 Dict Key 使用 __hash__ 进行访问

Jzl*_*325 1 python dictionary python-3.x

参加这个超级简单的课程:

class Foo():
    def __init__(self, iden):
        self.iden = iden
    def __hash__(self):
        return hash(self.iden)
    def __repr__(self):
        return str(self.iden)
Run Code Online (Sandbox Code Playgroud)

目标是创建类的实例以用作字典键。如果__repr__省略,则键是标准对象地址。可__repr__打印的表示可能是:

f = Foo(1)
g = Foo(2)
d = {f:'a', g:'b'}
print(d)
>>> {1:'a', 2:'b'}
Run Code Online (Sandbox Code Playgroud)

__repr__然而,当尝试通过键访问字典时,如何利用(或__str__就此而言)表示形式作为键似乎并不是立即显而易见的。

print(d[1]) 
>>> KeyError
Run Code Online (Sandbox Code Playgroud)

gli*_*dud 5

首先,__repr__()这是一个转移注意力的事情。它仅影响对象的显示方式。它与你想要做的事情无关。

如果你想让两个单独的对象引用字典中的同一个槽,你需要两件事(引用):

  • 对象必须具有相同的哈希值 ( hash(obj1) == hash(obj2))。
  • 对象比较必须相等 ( obj1 == obj2)。

您的上述实现执行前者,但不执行后者。您需要添加一个方法(无论如何,当您定义时,文档__eq__()实际上需要该方法)。__hash__()

class Foo():
    def __init__(self, iden):
        self.iden = iden
    def __hash__(self):
        return hash(self.iden)
    def __eq__(self, other):
        return self.iden == other
Run Code Online (Sandbox Code Playgroud)

 

>>> d = {Foo(1) : 'a'}
>>> d[1]
'a'
Run Code Online (Sandbox Code Playgroud)