Python 3中的不可变字典:如何使keys(),items()和values()字典视图不可变

时间:2012-04-11 17:46:33

标签: python dictionary python-3.x immutability

简短版本:覆盖dict.keys()和朋友的最佳方式是什么,以防止我在Python 3中意外修改我的(假设的)不可变字典?

在最近的一个问题中,我问过Hashing an immutable dictionary in Python。从那时起,我已经建立了一个我不满意的不可改变,可以翻译的字典。但是,我意识到它有一个漏洞:keys()items()values()返回的dictionary views仍然允许我不小心改变我的(据称)不可变字典。

我可以找到有关字典视图的Stack Overflow的唯一问题是Python create own dict view of subset of dictionary,但这似乎与我的问题没什么关系,What would a "frozen dict" be?的答案似乎没有进入覆盖keys()等等。

这样做会阻止我意外修改,例如,我的不可变字典的键吗?

class FrozenCounter(collections.Counter):
    "Model an hashable multiset as an immutable dictionary."
    # ...
    def keys(self):
        return list(super().keys())
    def values(self):
        return list(super().values())
    def items(self):
        return list(super().items())

<小时/>

我从答案中收集了什么

我主要是看不懂。

dictviews无法修改dicts。在Python 3 documentation中,我误读了,“它们提供了对字典条目的动态视图,这意味着当字典发生变化时,视图会反映这些变化,”当视图发生变化时,字典会反映这些变化。 “显然,这不是文件所说的。

2 个答案:

答案 0 :(得分:5)

在Python 2.x中,视图不允许您改变底层对象:

>>> a = { 'a' : 1 }
>>> a.keys()[0] = 'b'
>>> a
{'a': 1}
>>> a.values()[0] = 'b'
>>> a
{'a': 1}

在Python 3.x中,变异视图会产生TypeError:

>>> a = { 'a':1}
>>> a.keys()[0] = 'b'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'dict_keys' object does not support item assignment

答案 1 :(得分:0)

这可能是一个坏主意,因为它打破了这些方法首先返回视图的假设,并将它们替换为不再更新以匹配基础字典的可变对象。

您的观点如何能够改变您的字典?视图不支持项目分配或删除,因此我不相信他们可以更改基础字典。