如何在Python中“深度复制”二维列表而不导入

Rae*_*eng 0 python

我目前有一个二维矩阵

matrix =    [['.', '.', '.', '.', '.', '.'], 
             ['.', '.', '.', '.', '.', '.'], 
             ['.', '.', '.', '.', '.', '.'], 
             ['.', '.', '.', 'O', 'O', 'O'], 
             ['.', '.', '.', 'O', '.', '.'],
             ['.', '.', '.', 'O', 'O', '.']]
Run Code Online (Sandbox Code Playgroud)

我已指定copy = matrix制作矩阵的副本。但是,我遇到了一个错误,当我修改 时copy[],它也会修改matrix[]. 我发现这是别名的副作用,我需要创建matrix[].

如何在不使用导入的情况下创建二维矩阵的深层副本?

ale*_*ull 5

对于像矩阵这样的二维数组,这应该有效:

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 数组),但仅当列表是唯一使用的包含类型时才有效。