嵌套字典复制: copy() 还是 deepcopy()?

18 浏览
0 Comments

嵌套字典复制: copy() 还是 deepcopy()?

这个问题已经在这里有答案

Python使用中间变量更改字典

如何复制一个字典并只编辑复制品

我试图在代码的开头存储一个字典模板,大多数函数将使用它:

  • 字典:键=客户端名称,值=字典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日
0
0 Comments

当你使用可变的集合(如字典或列表)并执行赋值操作时,默认情况下你并未复制对象——即将一个字典 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

为了解决这个问题并且保持 neworig 字典对象分别是不相互引用的独立对象,当将 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中,赋值语句不会复制对象,它们只会在一个目标和一个对象之间创建绑定。对于可变集合或包含可变项的集合,有时需要创建副本以便更改一个而不影响另一个。

0