嵌套字典 copy() 或 deepcopy()?
Nested dictionaries copy() or deepcopy()?
我尝试在大多数函数都会用到的代码开头存储字典模板:
- 字典:keys = 客户名称,values = Dictionary2
- 字典 2:键 = 用户名,值 = None
我用我们所有的客户和他们的用户填满了它。然后代码的每个部分都可以复制这个字典并产生它自己的输出。目标是每个输出都将具有与模板相同的 "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
要解决此问题并使 new
和 orig
字典将不相互引用的对象分开,请在将其分配给 [时创建 orig
的 deepcopy =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.
我尝试在大多数函数都会用到的代码开头存储字典模板:
- 字典:keys = 客户名称,values = Dictionary2
- 字典 2:键 = 用户名,值 = None
我用我们所有的客户和他们的用户填满了它。然后代码的每个部分都可以复制这个字典并产生它自己的输出。目标是每个输出都将具有与模板相同的 "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
要解决此问题并使 new
和 orig
字典将不相互引用的对象分开,请在将其分配给 [时创建 orig
的 deepcopy =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.