浅拷贝列表

Shallow copy list

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

在此代码中,在对列表 (matrix2) 的浅表副本进行修改后,我们替换了列表中的整个列表,尽管 matrix2 是矩阵1.

>>> 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]]

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

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

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

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

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

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

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