另一个(不是相同的指针/ id)副本的列表与原始列表有所变化

时间:2018-12-29 01:31:16

标签: python python-3.x list

我知道,只需将一个列表分配给另一个预先存在的列表即可为其赋予相同的地址,例如

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随之变化。我已经检查了他们的ID,但是两者都与预期的不同。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您使用的是list嵌套 list,但是ref_matrix = result[:]仅对< em> top 级别list,因此您拥有一个新list,其中包含与第一个相同的list

这里最简单的解决方案是只切换到a full deep copy

import copy

然后替换:

ref_matrix = result[:]

具有:

ref_matrix = copy.deepcopy(result)

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