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