我的意思是为什么我们不能把字典的键设置为另一个字典?
这意味着我们不能有一个将另一个字典作为键的字典...
我的意思是为什么我们不能把字典的键设置为另一个字典?
这意味着我们不能有一个将另一个字典作为键的字典...
简短回答:因为它们是可变容器。
如果字典被散列,当您更改其内容时,其哈希值会发生变化。
这很容易处理。在哈希之前,将字典包装在一个frozenset中。然后,当您需要使用它时,将其转换回字典即可。
>>> unhashable = {'b': 'a', 'a': 'b'}
>>> hashable = frozenset(unhashable.items())
>>> unhashable = dict(hashable)
>>> unhashable
{'a': 'b', 'b': 'a'}
请注意,字典键的顺序是未定义的,因此键的变化并不重要。
就像其他人所说的那样,字典的哈希值会随着内容的变化而改变。
但是如果你真的需要将字典用作键,你可以子类化字典以创建一个可哈希版本。
>>> 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'}
这将用于字典的哈希值替换为对象在内存中的地址。
{}
下存储一个值,我不能使用{}
查找它,因为两个空的可哈希字典具有不同的ID和不同的哈希值。哈希函数的重要之处在于,对于两个“相等”的值,它必须返回相同的哈希值。 - Ned BatchelderPython中的可变容器类型都不是可哈希的,因为它们是可变的,因此它们的哈希值可以在其生命周期内发生变化。
([1], {2:3})
作为字典键。 - tzot>>> 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'}
您可以使用id(inner_dict)作为外部字典的键。
这与Java的行为相同,其中对象的默认哈希码保证对于该对象是唯一的(实际上是内存地址 - 但这是特定于实现的),并用作插入HashMap中的哈希码。
因此,在Java中,您可以有一个HashMap<HashMap<Integer,Integer>,Integer>
在Python中
some_dict = {{1: 1}: 1}
将会给你
TypeError:不可散列类型:'dict'
frozenset(D.items())
(对于字典D
)。frozenset
是一个可哈希且不可变的集合类型 -- 像dict
一样,由于不可哈希,set
也不能用作字典的键。 - u0b34a0f6aedict
的object
实现__hash__
- 即使dict
项发生更改,也不会改变,因为我们将整个dict
作为Key
而不是将dict
的键作为Key
。 - shahjapan