嵌套字典 copy() 或 deepcopy()?

Nested dictionaries copy() or deepcopy()?

我尝试在大多数函数都会用到的代码开头存储字典模板:

我用我们所有的客户和他们的用户填满了它。然后代码的每个部分都可以复制这个字典并产生它自己的输出。目标是每个输出都将具有与模板相同的 "base" 字典结构,其中 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 中的 None 值,它在每个过程后都会发生变化(当然取决于每个过程的输出)。

编辑: 我找到了复制库,但 copy() 似乎对我的情况没有帮助。我会尝试 deepcopy() 但为什么 copy() 不起作用?为什么 deepcopy() 会?

当你使用像字典或列表这样的可变集合并执行赋值时,默认情况下你不会创建该对象的副本——即某些字典的赋值 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 字典将不相互引用的对象分开,请在将其分配给 [时创建 origdeepcopy =18=]:

>>> 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 文档的 tl;dr:

Assignment statements in Python do not copy objects, they create bindings between a target and an object. For collections that are mutable or contain mutable items, a copy is sometimes needed so one can change one copy without changing the other.