为什么dict对象在python中不可用?

时间:2009-12-24 08:34:01

标签: python dictionary

我的意思是为什么我们不能把dict的键作为dict?

这意味着我们不能将具有密钥的字典作为另一个字典...

5 个答案:

答案 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'}

操作起来很容易,因为它只是一个字符串。并且,如果要引用其成员,可以将其反序列化为对象。