我很难弄清楚下面这个简单的列表是怎么回事。
在这段代码中,在对列表的浅层副本( 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]]
我发现了以下内容:之所以会出现这种情况,是因为列表本身并不真正包含对象,而是对内存中那些对象的引用。使用[:]
符号复制列表时,将返回一个新列表,其中包含与原始列表相同的引用。
你能帮我弄清楚上面的文字到底是什么意思吗?也许我漏掉了什么我自己也找不到答案。
发布于 2020-04-10 17:25:11
例如,您有一个list matrix1=[[1,2], [3,4]]
,并将其分配给matrix2 = matrix1
。当您将matrix1
分配给matrix2
时,它只是共享一个引用,它不会创建新的数组。现在,如果您更改了matrix1
或matrix2
中的任何数据,则更改将同时适用于这两个列表。
但是,如果使用切片操作,它将创建一个新的列表matrix2 = matrix1[:]
。现在,如果您更改matrix2
或matrix1
中的任何数据,则将分别应用更改。
注:切片操作生成表的浅拷贝。
matrix2[0][0] = x
--这将在两个列表中更改,因为浅层复制只适用于一个级别,如matrix2[0] = [x,y]
。
如果您不想更改数据,那么可以使用deepcopy
。它递归地复制每个对象。
https://stackoverflow.com/questions/61145127
复制相似问题