首页 > 解决方案 > 浅拷贝列表

问题描述

我很难用下面的浅表弄清楚这里发生了什么。

在这段代码中,在对列表(matrix2)的浅表副本进行修改之后,我们替换了列表中的整个列表,虽然matrix2是matrix1的浅表副本,但更改仅反映在matrix2而不是matrix1。

>>> matrix1 = [[1, 2], [3, 4]]
>>> matrix2 = matrix1[:]
>>> matrix2[0] = [5, 6]
>>> matrix2
[[5, 6], [3, 4]]
>>> matrix1
[[1, 2], [3, 4]]

在这部分代码中,结果是不同的,因为列表列表中的值的修改反映了两个矩阵。

>>> matrix2[1][0] = 1
>>> matrix2
[[5, 6], [1, 4]]
>>> matrix1
[[1, 2], [1, 4]]

我发现如下: 发生这种情况是因为列表并不真正包含对象本身,而是对内存中这些对象的引用。当您使用[:]符号制作列表的副本时,将返回一个新列表,其中包含与原始列表相同的引用。

你能帮我弄清楚以上文字的真正含义吗?也许我在这里遗漏了一些东西,我自己找不到答案。

标签: pythonpython-3.xshallow-copy

解决方案


例如,您有一个列表matrix1=[[1,2], [3,4]]并将其分配给 matrix2 = matrix1. 当您分配matrix1给它时,matrix2它只是共享一个引用,它不会创建新数组。现在,如果您更改任何数据matrix1matrix2更改将应用​​于两个列表。

但是如果您使用切片操作,它将创建一个新列表matrix2 = matrix1[:]。现在,如果您更改任何数据matrix2matrix1更改将分别应用。

注意:切片操作产生列表的浅拷贝。

matrix2[0][0] = x这将在两个列表中发生变化,因为浅拷贝浅拷贝仅适用于一个级别,例如matrix2[0] = [x,y].

如果您不想更改数据,则可以使用deepcopy. 它递归地复制每个对象。


推荐阅读