我的意思是为什么我们不能把dict的键作为dict?
这意味着我们不能将具有密钥的字典作为另一个字典...
答案 0 :(得分:37)
简短回答:因为它们是可变容器。
如果dict被哈希处理,其哈希值会随着你改变其内容而改变。
答案 1 :(得分:14)
这很容易处理。在散列之前将dict包装在冻结集中。然后,当您需要使用它时,将其转换回dict。
>>> unhashable = {'b': 'a', 'a': 'b'}
>>> hashable = frozenset(unhashable.items())
>>> unhashable = dict(hashable)
>>> unhashable
{'a': 'b', 'b': 'a'}
请注意,字典键顺序无论如何都是未定义的,因此键顺序的更改并不重要。
答案 2 :(得分:6)
正如其他人所说,dict的哈希值随着内容的变化而变化。
但是,如果你真的需要使用dicts作为键,你可以将dict子类化为一个可以使用的版本。
>>> class hashabledict(dict):
... def __hash__(self):
... return id(self)
...
>>> hd = hashabledict()
>>> d = dict()
>>> d[hd] = "foo"
>>> d
{{}: 'foo'}
>>> hd["hello"] = "world"
>>> d
{{'hello': 'world'}: 'foo'}
这会将用于dict的哈希值替换为内存中对象的地址。
答案 3 :(得分:1)
Python中的可变容器类型都不是hashable,因为它们是可变的,因此它们的哈希值可以在其生命周期内发生变化。
答案 4 :(得分:1)
由于错误的原因,我多次遇到这个问题;在哪里我想引用一个完整的dict
作为某事的关键。我不需要它是可变的,但我确实希望保留并轻松访问dict
的成员。
我发现使dict
不可变且可快速用作关键值的最简单方法是使其成为JSON(或在您最喜欢的替代品中序列化)。
例如:
>>> import json
>>> d = {'hey':1, 'there':2}
>>> d_key = json.dumps(d)
>>> d_key
'{"there": 2, "hey": 1}'
>>> d2 = {d_key: 'crazytown'}
>>> d2
{'{"there": 2, "hey": 1}': 'crazytown'}
操作起来很容易,因为它只是一个字符串。并且,如果要引用其成员,可以将其反序列化为对象。