为什么字典对象在Python中是不可哈希的?
我的意思是,为什么我们不能把字典的键设置为另一个字典呢?
这就是说,我们不能有一个字典,它的键是另一个字典...
6 个回答
5
正如其他人所说,字典的哈希值会随着内容的变化而变化。
不过,如果你真的需要把字典用作键,可以通过创建一个字典的子类来制作一个可以被哈希的版本。
>>> 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'}
这样做会把字典的哈希值替换成这个对象在内存中的地址。
20
这个问题很好解决。你可以先把字典放进一个不可变集合(frozenset)里,然后再进行哈希操作。等到你需要用到这个字典的时候,再把它转换回字典就可以了。
>>> unhashable = {'b': 'a', 'a': 'b'}
>>> hashable = frozenset(unhashable.items())
>>> unhashable = dict(hashable)
>>> unhashable
{'a': 'b', 'b': 'a'}
需要注意的是,字典的键的顺序本来就没有固定的,所以键的顺序变化也无所谓。
47
简短的回答是:因为它们是可变容器。
如果一个字典可以被哈希(也就是计算出一个唯一的标识),那么当你改变它里面的内容时,它的哈希值也会跟着改变。