关于python:嵌套字典copy()或deepcopy()?

Nested dictionaries copy() or deepcopy()?

本问题已经有最佳答案,请猛点这里访问。

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

  • 字典:keys=客户端名称,values=字典2
  • 字典2:keys=用户名,values=无

我把我们所有的客户和他们的用户都填满了。然后代码的每个部分都可以复制这个字典并生成它自己的输出。目标是每个输出都将具有相同的"基本"字典结构,就像模板一样,其中没有一个可以修改。

对于使用此词典的每个进程,我使用以下内容:

1
2
3
4
5
6
7
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()会?


当您使用可变集合(如字典或列表)并执行赋值时,默认情况下不会创建该对象的副本,即,将某个dict b赋值给另一个dict a创建从b到原始对象a的引用,这样当您对a进行赋值时,x1〔0〕你也间接地突变了a

请参见以下基本示例:

1
2
3
4
5
6
7
8
9
>>> 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字典分开不相互引用的对象,请在将其分配给new时制作orig的deepcopy:

1
2
3
4
5
6
7
8
9
10
>>> 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.