Ben*_*mes 39
简短回答:因为它们是可变容器.
如果对dict进行了哈希处理,则当您更改其内容时,其哈希值会发生变化.
use*_*515 14
这很容易处理.在散列之前将dict包装在冻结集中.然后,当您需要使用它时,将其转换回dict.
>>> unhashable = {'b': 'a', 'a': 'b'}
>>> hashable = frozenset(unhashable.items())
>>> unhashable = dict(hashable)
>>> unhashable
{'a': 'b', 'b': 'a'}
Run Code Online (Sandbox Code Playgroud)
请注意,字典键顺序无论如何都是未定义的,因此键顺序的更改无关紧要.
正如其他人所说,dict的哈希值随着内容的变化而变化.
但是,如果您确实需要使用dicts作为键,则可以将dict子类化为hasable版本.
>>> 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'}
Run Code Online (Sandbox Code Playgroud)
这将用于dict的哈希值替换为内存中对象的地址.