使用对象作为字典键

3

我有一个字典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)中提到的条件外,该方法是否存在安全隐患?

拥有一个键和值相同的字典有什么意义呢?只有当对象是可哈希的(定义了__hash__)时,才支持这种方式。使用列表或集合有什么问题吗? - Sunny Patel
所以你正在尝试将对象用作字典中的键。我不理解这个动机。 - pylang
你一定要将对象作为字典的键吗?你不能像将对象保存在单独的列表中,然后使用该列表的索引作为键吗? - Ulisha
这个问题比较学术,我希望得到的答案是为了澄清问题,而不是提供类似效果的解决方案 :-) - Michael
1个回答

2
为了作为字典的键,一个对象必须支持hash函数(例如通过__hash__),等值比较(例如通过__eq____cmp__),并且必须满足上述正确性条件。
话虽如此,不能使用列表作为字典键的简单答案是,列表没有提供有效的__hash__方法。 请参考为什么列表不能作为字典键?以获取详细信息。
但是你可以使用tuple()对象作为key,因为元组是可哈希的。 因此,以下操作是有效的:
>>> e = (1, 2, 3)
>>> d = {a: 'a', b: 'b', c: 'c', e: 'e'}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接