python - 按行主要顺序填充 2D 矩阵
问题描述
我尝试在此方法中使用 python 中的列表创建一个二维数组:
N = 3
A = [[0]*N]*N
for i in range(N):
for j in range(N):
A[i][j] = (i*N + j+1)
print (A)
输出是:
[[7, 8, 9], [7, 8, 9], [7, 8, 9]]
我想要这样的输出:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
有人可以告诉我这段代码有什么问题吗?
解决方案
问题是你用来A = [[0]*N]*N
初始化A。这是一个引用复制的方法!这意味着 A 中的元素指向内存中的同一个单元格,因此,当您为 A 分配一个值时,您将相同的值分配给 A 中的多个单元格!更准确地说,在您的代码中发生的情况是 i 的最后一个循环用 and 覆盖所有先前的书面结果,[7 8 9]
因此您得到[[7,8,9], [7,8,9], [7,8,9]]
的不是[[1, 2, 3], [4, 5, 6], [7, 8, 9]
.
这是一个修复,它在没有引用的情况下初始化 A:
N = 3
A = [[[0] for k in range(N)] for m in range(N)]
for i in range(N):
for j in range(N):
A[i][j] = (i*N + j+1)
print (A)
A
如上所述使用列表理解进行初始化时,A 中的每个单元格都指向内存中的不同位置,因此结果如您所愿:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]