我目前有一个二维矩阵
matrix = [['.', '.', '.', '.', '.', '.'],
['.', '.', '.', '.', '.', '.'],
['.', '.', '.', '.', '.', '.'],
['.', '.', '.', 'O', 'O', 'O'],
['.', '.', '.', 'O', '.', '.'],
['.', '.', '.', 'O', 'O', '.']]
Run Code Online (Sandbox Code Playgroud)
我已指定copy = matrix
制作矩阵的副本。但是,我遇到了一个错误,当我修改 时copy[]
,它也会修改matrix[]
. 我发现这是别名的副作用,我需要创建matrix[]
.
如何在不使用导入的情况下创建二维矩阵的深层副本?
对于像矩阵这样的二维数组,这应该有效:
def deep_copy(A):
return [r[:] for r in A]
Run Code Online (Sandbox Code Playgroud)
它相当于循环每个内部列表并复制每个内部列表。如果内部列表中的值是可变的,则这不足以进行深度复制,但对于您的用例来说应该没问题。还有[[v for v in r] for r in A]
,它手动复制而不是使用切片来执行此操作。
编辑:还有一种更通用的递归方法适用于您使用不可变值列表的情况:
def deep_copy_r(v):
if isinstance(v, list):
return [deep_copy_r(e) for e in v]
return v
Run Code Online (Sandbox Code Playgroud)
所述递归方法将适用于任意数组维度(适用于 3D 数组、4D 数组,直至 ND 数组),但仅当列表是唯一使用的包含类型时才有效。