gpt4 book ai didi

python - Python 3 中的不可变字典 : how to make keys(), items() 和 values() 字典 View 不可变

转载 作者:太空狗 更新时间:2023-10-29 21:47:21 24 4
gpt4 key购买 nike

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

在最近的一个问题中,我问了关于 Hashing an immutable dictionary in Python 的问题.从那时起,我构建了一个我很满意的不可变、可散列的字典。然而,我意识到它有一个洞:dictionary views keys()items()values() 返回的结果仍然允许我不小心改变了我的(假定的)不可变字典。

我能在 Stack Overflow 上找到的关于字典 View 的唯一问题是 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 不能修改字典。在Python 3 documentation ,我误读了,“它们提供了字典条目的动态 View ,这意味着当字典发生变化时, View 会反射(reflect)这些变化”就像“当 View 发生变化时,字典会反射(reflect)这些变化”。显然这不是文档所说的。

最佳答案

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

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

在 Python 3.x 中,改变 View 会产生 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

关于python - Python 3 中的不可变字典 : how to make keys(), items() 和 values() 字典 View 不可变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10111212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com