python - 跨键共享 defaultdict 中的字典

标签 python dictionary

我在 defaultdict 中有一本字典。我注意到字典正在跨键共享,因此它采用最后一次写入的值。我怎样才能隔离那些字典?

>>> from collections import defaultdict
>>> defaults = [('a', 1), ('b', {})]
>>> dd = defaultdict(lambda: dict(defaults))
>>> dd[0]
{'a': 1, 'b': {}}
>>> dd[1]
{'a': 1, 'b': {}}
>>> dd[0]['b']['k'] = 'v'
>>> dd
defaultdict(<function <lambda> at 0x7f4b3688b398>, {0: {'a': 1, 'b': {'k': 'v'}}, 1:{'a': 1, 'b': {'k': 'v'}}})
>>> dd[1]['b']['k'] = 'v2'
>>> dd
defaultdict(<function <lambda> at 0x7f4b3688b398>, {0: {'a': 1, 'b': {'k': 'v2'}}, 1: {'a': 1, 'b': {'k': 'v2'}}})

请注意,两个词典的 v 都设置为 v2。这是为什么?以及如何在没有太多性能开销的情况下改变这种行为?

最佳答案

当你执行 dict(defaults) 时,你并不是在复制内部字典,只是对它进行另一个引用。因此,当您更改该词典时,您将在引用它的所有地方看到更改。

这里需要deepcopy来避免这个问题:

import copy
from collections import defaultdict
defaults = {'a': 1, 'b': {}}
dd = defaultdict(lambda: copy.deepcopy(defaults))

或者您需要通过不重复引用 defaults 来在连续调用中不使用相同的内部可变对象:

dd = defaultdict(lambda: {'a': 1, 'b': {}})

关于python - 跨键共享 defaultdict 中的字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24746277/

相关文章:

python - 为什么Python中可以在赋值前使用全局变量?

python - 收敛警告 : Maximum Likelihood slows kernel-run-time?

python - DialogFlow 检测意图文本

python - 使用 numpy 进行大量回归的有效方法?

java - 如何优雅地从 Map 中获取唯一元素

python - 在 Python 中排除 collections.Counter 中的零

java - 使用 Java 的拼写检查器,必须打印出特定行

python - map 功能花费太多时间(Pandas DataFrame)

python - 在 Python 中,如果它等于某个值,我如何循环遍历字典并更改值?

python - 哪个数据库可以存储非常大的嵌套 Python 字典?