简短版:在Python 3中,如何最好地覆盖dict.keys()
等操作,以防止意外修改(本应是)不可变的字典?
我曾经问过一个关于在Python中哈希不可变字典的问题。此后,我已经创建了一个我满意的不可变、可哈希字典。但是,我发现它有一个漏洞:由keys()
,items()
和values()
返回的字典视图仍然允许我意外地修改我的(本应是)不可变字典。
我在Stack Overflow上找到的唯一一个关于字典视图的问题是Python create own dict view of subset of dictionary,但那似乎与我的问题没有太多关系,而“冻结字典”是什么?的答案似乎没有涉及覆盖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 无法修改字典。在Python 3文档中,我误读了“They provide a dynamic view on the dictionary’s entries, which means that when the dictionary changes, the view reflects these changes”为“当视图更改时,字典反映这些更改”,显然这不是文档所说的。
a.keys()[0]
不是一个相关的测试:正如错误消息所指示的那样,它只是说您可以设置a.keys()
的元素#0。它并没有说您不能修改它。问题在于视图没有“元素#0”(它们大多是具有任意顺序的对象集合)。 - Eric O. Lebigota = { 'a' : set() }; print a; a.values()[0].add("0"); print a
- user1202136