首页 > 解决方案 > 按行主要顺序填充 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]]

有人可以告诉我这段代码有什么问题吗?

标签: pythonpython-3.xlist

解决方案


问题是你用来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]

推荐阅读