我觉得以前一定要问过,但我一直无法找到我正在寻找的解决方案:
我有一个简单的字典a
,其中包含一个键和一个列表。我想复制该字典以备将来使用,但我对a
所做的任何更改都会影响我的副本b
。:
>>> a
{'kn': [8, 9, 10, 11, 12]}
>>> b = a.copy()
>>> b
{'kn': [8, 9, 10, 11, 12]}
>>> for l in range(len(a['kn'])):
... a['kn'][l] = a['kn'][l] + 10
>>> a
{'kn': [18, 19, 20, 21, 22]}
>>> b
{'kn': [18, 19, 20, 21, 22]}
答案 0 :(得分:4)
那是因为你没有复制字典。
这应该指向正确的方向:https://docs.python.org/2/library/copy.html
简而言之,当您copy()
字典时,您只是将指针复制到字典中的项目。因此,当您更改一个字典中的值时,由于两者中的指针都相同,因此更改会立即显示在另一个字典中。
通过执行deepcopy()
,您将值从一个字典复制到另一个字典。现在你有两个单独的副本。
答案 1 :(得分:3)
是的,dict.copy
会返回字典的浅层副本:
a.copy??
Docstring: D.copy() -> a shallow copy of D
Type: builtin_function_or_method
浅拷贝构造一个新的复合对象,然后(尽可能) 将引用 插入到原始对象中找到的对象。
相反,请使用执行深层复制的 copy.deepcopy
:
深层复制构造一个新的复合对象,然后递归地 将复制 插入到原始对象中。
>>> import copy
>>> b = copy.deepcopy(a)
>>> for l in range(len(a['kn'])):
... a['kn'][l] = a['kn'][l] + 10
>>> a
{'kn': [18, 19, 20, 21, 22]}
>>> b
{'kn': [8, 9, 10, 11, 12]}
答案 2 :(得分:1)
如果我理解正确,.copy()会执行浅拷贝,因此字典中的列表仍然作为参考传递。您需要使用深层复制。
import copy a = {'kn': [8, 9, 10, 11, 12]} b = copy.deepcopy(a)
答案 3 :(得分:0)
您使用了浅版本的.copy(),即您已经为字典创建了两个副本,但它们都包含相同的列表引用。您需要使用here所述的copy.deepcopy(),区别在于:
浅复制构造一个新的复合对象,然后(尽可能)将对它的引用插入到原始对象中找到的对象。
深层复制构造一个新的复合对象,然后以递归方式将副本插入到原始对象中找到的对象。