使用对象作为字典键
问题描述:
我有一本字典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)中提到的其他条件下是不安全的吗?
答
为了用作一个字典的键,对象必须支持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'}
有一个字典的关键是值的点是什么?只有在对象可以被哈希(具有__hash__定义)时才会被支持。使用列表或集合有什么问题? –
因此,您正尝试将对象用作字典中的键。我不明白这个动机。 – pylang
您必须将对象作为字典的键吗?难道你不能做像保持对象在一个单独的列表,并使用该列表的索引作为关键? – Ulisha