克隆的字典被新字典

时间:2016-01-19 17:54:00

标签: python dictionary

我觉得以前一定要问过,但我一直无法找到我正在寻找的解决方案:

我有一个简单的字典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]}

4 个答案:

答案 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(),区别在于:

  

浅复制构造一个新的复合对象,然后(尽可能)将对它的引用插入到原始对象中找到的对象。

     

深层复制构造一个新的复合对象,然后以递归方式将副本插入到原始对象中找到的对象。