如何将列表复制到另一个变量并使该变量不可变?

How to copy a list to another variable and leave this variable immutable?

我已经完成了一个算法,可以反转数组的对角线。我正在尝试将列表 a 复制到不可变的 b

我尝试使用 "slices" (b = a[:])、列表理解和 b = a.copy(),但唯一有效的是 b = copy.deepcopy(a)。还有其他获取副本的方法吗?

import copy
a = [[1,2,3],[4,5,6],[7,8,9]]
b = copy.deepcopy(a)
d = b
c = []

h = len(a[0])-1
x_ptrocar = []

for i in range(len(a)-1):
    if i == h:
        break
    else:
        x_ptrocar.extend([[i,i,h,h],[i,h,h,i],[h,h,i,i],[h,i,i,h]])
        h -=1
for l in range(len(x_ptrocar)):
    for m in range(0,4):
        y_original = x_ptrocar[l][3]
        y_ptrocar = x_ptrocar[l][1]
        x_original = x_ptrocar[l][2]
        x_ptrocarr = x_ptrocar[l][0]
        a[x_original][y_original]=b[x_ptrocarr][y_ptrocar]
print(a)

我希望 [[1,2,3],[4,5,6],[7,8,9]] 的输出是 [[9,2,7], [4,5,6],[3,8,1]],它适用于 copy.deepcopy,但不适用于我能找到的任何其他方法。

copy.deepcopy 对此有点矫枉过正,拉入一个模块并增加函数开销。由于您有一个列表列表,因此使用 b = a[:] 复制外部列表是不够的,因为 ab 中的内部列表都指向相同的对象。

您可以按如下方式使用列表理解:

b = [x[:] for x in a]

这对 a 中的每个列表进行切片,创建每个子列表的新副本而没有别名。


顺便说一句,逻辑可以稍微简化——走向矩阵的中心,沿途交换 top-left/bottom-right 和 top-right/bottom-left 单元格:

def reverse_diagonals(m):
    m = [x[:] for x in m]

    for i in range(len(m) // 2):
        m[i][i], m[-i-1][-i-1] = m[-i-1][-i-1], m[i][i]
        m[i][-i-1], m[-i-1][i] = m[-i-1][i], m[i][-i-1]

    return m

这假设一个 nxn 矩阵。