嵌套字典复制: copy() 还是 deepcopy()?
嵌套字典复制: copy() 还是 deepcopy()?
这个问题已经在这里有答案:
我试图在代码的开头存储一个字典模板,大多数函数将使用它:
- 字典:键=客户端名称,值=字典2
- 字典2:键=用户名称,值=None
我填充了所有客户端和它们的用户。然后代码的每个部分可以复制此字典并生成自己的输出。目标是每个输出都具有相同的“基本”字典结构,就像一个模板,其中None可以修改。
对于使用此词典的每个过程,我使用以下内容:
process1dict = clientdict # processing 1 output1dict = ... #modified version of original clientdict, the None values have been replaced by dictionaries/lists process2dict = clientdict # processing 2 output2dict = ... #same here but could be different
我的问题是,每次将它复制到一个进程中,cliendict都会发生变化!我注意到由于我的初始cliendict中有None值,因此它在每个进程之后都会发生变化(当然取决于每个进程的输出)。
编辑:我找到了复制库,但copy()
似乎对我的情况没有帮助。我会尝试使用深层复制,但为什么copy()
无效?为什么deepcopy()
会有效?
admin 更改状态以发布 2023年5月22日
当你使用可变的集合(如字典或列表)并执行赋值操作时,默认情况下你并未复制对象——即将一个字典 b
赋给另一个字典 a
会创建一个从 b
指向原始对象 a
的引用,因此当你更改 b
时,也会间接更改 a
。
看下面的基本示例:
>>> orig = {"a": 1, "b": 2} >>> new = orig >>> new["a"] = 9 >>> orig {'a': 9, 'b': 2} >>> new {'a': 9, 'b': 2} >>> new is orig True
为了解决这个问题并且保持 new
和 orig
字典对象分别是不相互引用的独立对象,当将 orig
赋给 new
时,需要进行 deepcopy 操作:
>>> import copy >>> orig = {"a": 1, "b": 2} >>> new = copy.deepcopy(orig) >>> new["a"] = 9 >>> orig {'a': 1, 'b': 2} >>> new {'a': 9, 'b': 2} >>> new is orig False
此外,下面是上述Python文档的简短总结:
在Python中,赋值语句不会复制对象,它们只会在一个目标和一个对象之间创建绑定。对于可变集合或包含可变项的集合,有时需要创建副本以便更改一个而不影响另一个。