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

Ale*_*lex 5 python dictionary copy deep-copy

我尝试在代码的开头存储一个词典模板,大多数功能将使用该模板:

  • 字典:键=客户名称,值=字典2
  • Dictionary2:键=用户名,值=无

我把所有的客户和他们的用户都塞满了。然后,代码的每个部分都可以复制此字典并产生其自己的输出。目标是每个输出将具有相同的“基本”字典结构,如模板,在其中可以修改“无”。

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

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
Run Code Online (Sandbox Code Playgroud)

我的问题是,每次复制到流程中时,先后顺序都会改变!我注意到由于None初始值的cliendict变化,它在每个过程之后都会改变(取决于每个过程的输出)。

编辑:我找到了副本库,但copy()似乎无济于事。我将尝试使用deepcopy(),但是为什么copy()不起作用?为什么deepcopy()会呢?

Joh*_*ing 8

当你有一个可变的集合像一本字典或列表的工作,并执行分配,没有创建默认情况下该对象的副本-即一些字典的分配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
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,并保持neworig字典分离不相互引用的对象,使deepcopy的orig将其分配给时new

>>> 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
Run Code Online (Sandbox Code Playgroud)

另外,这是上面链接到的Python文档的tl; dr:

Python中的赋值语句不复制对象,它们在目标和对象之间创建绑定。对于可变或包含可变项的集合,有时需要一个副本,因此一个副本可以更改一个副本而不更改另一个副本。