使用对象作为字典键

问题描述:

我有一本字典d存储有关对象的一些信息:使用对象作为字典键

class A: 
    def __init__(self, x): 
     self.x = x 

a = A(1) 
b = A(1) 
c = 'hello world' 
e = [1, 2, 3] 

d = {a: 'a', b: 'b', c: 'c', e: 'e'} 

出现了两个问题:

  1. 这种方法不适用于列表或其他物体,其哈希工作不对应于存储地址。在这种情况下我能做些什么?
  2. 该方法在问题(1)中提到的其他条件下是不安全的吗?
+0

有一个字典的关键是值的点是什么?只有在对象可以被哈希(具有__hash__定义)时才会被支持。使用列表或集合有什么问题? –

+0

因此,您正尝试将对象用作字典中的键。我不明白这个动机。 – pylang

+0

您必须将对象作为字典的键吗?难道你不能做像保持对象在一个单独的列表,并使用该列表的索引作为关键? – Ulisha

为了用作一个字典的键,对象必须支持hash功能(例如,通过__hash__),相等比较(例如,通过__eq____cmp__),并且必须满足上述条件的正确性。

也就是说,列表不能用作字典键的简单答案是列表不提供有效的__hash__方法。

详细信息请参考Why Lists Can't Be Dictionary Keys?

但是您可以使用tuple()对象而不是key作为元组可哈希值。因此,这是有效的:

>>> e = (1, 2, 3) 
>>> d = {a: 'a', b: 'b', c: 'c', e: 'e'}