就在我以为我已经理解了Python列表是如何工作的时候…
>>> a = [1,2,3]
>>> b = a[:]
>>> b
[1,2,3]
>>> b[1]=100
>>> b
[1,100,3]
>>> a
[1,2,3]到现在为止还好。我用a的内容初始化b,这样b就指向一个不同的对象。因此,b中的更改不会影响a。
现在来看另一个例子:
>>> a = [[1,2,3],[4,5,6],[7,8,9]]
>>> b = a[:][:]
>>> b
[[1,2,3],[4,5,6],[7,8,9]]
>>> b[1][1] = 100
>>> b
[[1,2,3],[4,100,6],[7,8,9]]
>>> a
[[1,2,3],[4,100,6],[7,8,9]]为什么这一次b的变化会影响a?与前面的示例有什么不同?
发布于 2013-06-14 04:23:45
切片操作x[:]进行浅层复制。这意味着,外部列表是不同的,但包含完全相同的元素。假设a = [[1]]
b = a[:] # is the same as:
b = [x for x in a]
>>> a[0] is b[0]
True双重切片([:][:])的作用仅此而已--同样:
b = a[:][:] # is the same as:
b = [y for y in [x for x in a]]
>>> a[0] is b[0]
True浅拷贝的浅拷贝就是浅拷贝。
因此,b仍然是a的浅表副本-这些列表是不同的对象,但它们包含相同的元素。然后在b中修改内部列表,但在a中是相同的列表。
可以使用b=[x[:] for x in a]进行2级浅层复制。它以同样的方式扩展到n级复制。
顺便说一句,术语“浅层复制”对于任何类或容器都具有相同的含义。
如果你想要真正的深度拷贝,你应该考虑使用deep copy。
发布于 2013-06-14 04:27:55
silcing制作了一个浅层拷贝。但内部对象仍未复制,因此如果它们是可变的,并且您将对其进行修改,则它们将被修改;)在这两个列表中,您将看到以下内容
使用列表理解
b = [i[:] for i in a]或copy.deepcopy()
import copy
b = copy.deepcopy(a)发布于 2013-06-14 04:29:13
试试这个:
In [38]: import copy
In [39]: a = [[1,2,3],[4,5,6],[7,8,9]]
In [40]: b=copy.deepcopy(a)
In [41]: b[1][1] = 100
In [42]: a
Out[42]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
In [43]: b
Out[43]: [[1, 2, 3], [4, 100, 6], [7, 8, 9]]阅读更多@ http://docs.python.org/2/library/copy.html
https://stackoverflow.com/questions/17096298
复制相似问题