gpt4 book ai didi

python - 跨键共享 defaultdict 中的字典

转载 作者:太空狗 更新时间:2023-10-30 02:11:07 24 4
gpt4 key购买 nike

我在 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/

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