如何将列表复制到另一个变量并使该变量不可变?
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[:]
复制外部列表是不够的,因为 a
和 b
中的内部列表都指向相同的对象。
您可以按如下方式使用列表理解:
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 矩阵。
我已经完成了一个算法,可以反转数组的对角线。我正在尝试将列表 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[:]
复制外部列表是不够的,因为 a
和 b
中的内部列表都指向相同的对象。
您可以按如下方式使用列表理解:
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 矩阵。