作为另一个副本(不是相同的指针/id)的列表与原始列表一起更改



我知道简单地将一个列表分配给另一个预先存在的列表会给它相同的地址,例如

x = [1, 2] y = x y[0] = 3 print(x, y)

给出输出

[3, 2] [3, 2]

为了防止这种情况,它必须这样写......

y = list(x)y = x[:]

但是,这似乎不适用于我的情况...

for i in range(layer_rot):
            for r in range(l - 1, n_rows - l + 1):
                if r == l - 1:
                    result[r][n_col - l] = int(ref_matrix[r + 1][n_col - l])
                elif r == n_rows - l:
                    result[r][l - 1] = int(ref_matrix[r - 1][l - 1])
                else:
                    result[r][l - 1] = int(ref_matrix[r - 1][l - 1])
                    result[r][n_col - l] = int(ref_matrix[r + 1][n_col - l])
            ...
            ref_matrix = result[:] # Assume ref_matrix is initialized correctly before the first iteration of the outer loop

我希望ref_matrix只是result的副本,但是当我更改条件语句中的result时,我注意到ref_matrix随之而变化。我已经检查了他们的身份证,但他们都像预期的那样不同。有什么想法吗?

您正在使用 list s 的嵌套list,但ref_matrix = result[:]只制作顶级list拷贝,因此您有一个新的list包含与第一个相同的list s。

这里最简单的解决方案是切换到完整的深度副本:

import copy

然后替换:

ref_matrix = result[:]

跟:

ref_matrix = copy.deepcopy(result)

无论您的list嵌套有多深(以及它们的内容有多可变),这都将确保所有可变元素与原始list完全分离。

最新更新