在Python中复制矩阵

在Python中复制矩阵,python,matrix,Python,Matrix,我想复制一个矩阵,这样更改副本中的值不会更改原始中的值。我理解以下内容不正确的原因: matrix1 = [[1, 2, 3], [1, 2, 3], [1, 2, 3]] matrix2 = matrix1 matrix2[0][0] = 9 matrix2 # [[9, 2, 3], [1, 2, 3], [1, 2, 3]] matrix1 # [[9, 2, 3], [1, 2, 3], [1, 2, 3]] matrix2 is matrix1 # True 我最初的做法是:

我想复制一个矩阵,这样更改副本中的值不会更改原始中的值。我理解以下内容不正确的原因:

matrix1 = [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
matrix2 = matrix1
matrix2[0][0] = 9
matrix2  # [[9, 2, 3], [1, 2, 3], [1, 2, 3]]
matrix1  # [[9, 2, 3], [1, 2, 3], [1, 2, 3]]
matrix2 is matrix1  # True
我最初的做法是:

matrix1 = [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
matrix2 = matrix1[:][:]
matrix2[0][0] = 9
matrix2  # [[9, 2, 3], [1, 2, 3], [1, 2, 3]]
matrix1  # [[9, 2, 3], [1, 2, 3], [1, 2, 3]]
matrix2 is matrix1  # False

在第二段代码摘录中,
matrix1
matrix2
未引用同一对象那么,为什么
matrix2
中的更改仍然会影响
matrix1
我的理解是,如果它们是单独的对象,那么更改一个对象不会更改另一个对象,这就是为什么切片表示法适用于一维数组。

第一个
[:]
生成最外层列表的副本。第二个
[:]
生成最外层列表的另一个副本


你想做的就是所谓的“深度复制”。查看
copy
模块:

matrix1[:][:]
只是复制了一份副本。它不复制子列表。请尝试
[matrix1[k]是matrix2[k]表示范围内的k(len(matrix1))]
。进一步解释一下,它将浅表副本复制为浅表副本(意味着每行中的项仍然是相同的项,因为它是二维的)。请参阅:我知道,关于如何在Python中复制矩阵的问题已经得到了回答。我在问为什么尽管
matrix1
matrix2
引用了不同的对象,但双切片符号并没有像我预期的那样工作。要重新表述@user2357112所说的话(我只是花了一段时间才理解):
matrix1[:]
matrix1[:]
matrix1[:][:][:][:]
(所有这些都会有不同的
id
s)。由于python不知道这是一个矩阵,所以您一直在复制最外层的列表。因此,您一直在引用(而不是复制)每个列表中的内容,即每一行。如果您想安全地执行此操作,可以使用(
deepcopy
或)
matrix2=[k[:]表示matrix1中的k]