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

sha*_*pan 25 python dictionary

我的意思是为什么我们不能把字典的关键字作为字典?

这意味着我们不能将字典作为另一个字典...

Ben*_*mes 39

简短回答:因为它们是可变容器.

如果对dict进行了哈希处理,则当您更改其内容时,其哈希值会发生变化.

  • 实际上,Python使散列对象变得容易,它为每个对象提供了一个可以散列的唯一且恒定的标识. (8认同)
  • 如果必须的话,使dict的可清洗表示 - 例如`frozenset(D.items())`(对于`D`字典).`frozenset`是一个可散列且不可变的集合 - 由于与`dict`相同的原因,`set`是不可删除的. (6认同)
  • 我甚至不想开始想象使用对象作为关键所需的噩梦般的逻辑. (2认同)

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)

请注意,字典键顺序无论如何都是未定义的,因此键顺序的更改无关紧要.

  • 冻结字典的哈希值不取决于值,仅取决于键。因此,对于那些希望使用字典作为另一本字典的键的用户,如果这是您想要的,那将行不通。 (2认同)

Dav*_*rby 6

正如其他人所说,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的哈希值替换为内存中对象的地址.

  • 但这没用:如果我在`{}`下存储一个值,我就不能用`{}`查找它,因为两个空的hashabledicts有不同的id和不同的哈希值.关于哈希函数的重要一点是它必须为两个"相等"值返回相同的哈希值. (7认同)
  • 如果你只是想区分不同的词汇,它可能会很有用.但要注意; 如果一个dict被垃圾收集,一个新实例化的dict可以驻留在内存中的同一个地方,从而产生相同的`id()`,从而产生一个难以找到的bug. (2认同)