复制python列表

Mar*_*lez 9 python list deep-copy

正当我以为我已经理解了Python列表如何工作......

>>> a = [1,2,3]
>>> b = a[:]
>>> b
[1,2,3]
>>> b[1]=100
>>> b
[1,100,3]
>>> a
[1,2,3]
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.我正在使用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]]
Run Code Online (Sandbox Code Playgroud)

为什么这次b的变化会受到影响?与前面的例子有什么不同?

Ela*_*zar 11

切片操作x[:]使浅拷贝.这意味着,外部列表不同,但包含完全相同的元素.假设a = [[1]]:

b = a[:] # is the same as:
b = [x for x in a]

>>> a[0] is b[0]
True
Run Code Online (Sandbox Code Playgroud)

双切片([:][:])只是做了 - 再次:

b = a[:][:] # is the same as:
b = [y for y in [x for x in a]]

>>> a[0] is b[0]
True
Run Code Online (Sandbox Code Playgroud)

浅拷贝的浅拷贝是浅拷贝.

所以b仍然是一个浅层副本a- 这些列表是不同的对象,但它们包含相同的元素.然后你改变内部列表b,但它是相同的列表a.

可以使用2级浅拷贝b=[x[:] for x in a].它以相同的方式扩展到n级复制.

顺便说一句,术语"浅拷贝"对于任何类或容器具有相同的含义.

如果您想要真正的深层复制,则应考虑使用深层复制.