简短版本:覆盖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中,我误读了,“它们提供了对字典条目的动态视图,这意味着当字典发生变化时,视图会反映这些变化,”当视图发生变化时,字典会反映这些变化。 “显然,这不是文件所说的。
答案 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)
这可能是一个坏主意,因为它打破了这些方法首先返回视图的假设,并将它们替换为不再更新以匹配基础字典的可变对象。
您的观点如何能够改变您的字典?视图不支持项目分配或删除,因此我不相信他们可以更改基础字典。