用命名元组填充矩阵

Filling the matrix with namedtuples

为什么矩阵中充满了这样的命名元组?

索引插入不正确

如何解决?

from collections import namedtuple

Point = namedtuple('Point', ['x', 'y'])
m, n = 3, 3
matrix = [[None] * n] * m
for i in range(m):
    for j in range(n):
        matrix[i][j] =  Point(i, j)
for row in matrix:
    print(row)

#>>Output
#[Point(x=2, y=0), Point(x=2, y=1), Point(x=2, y=2)]
#[Point(x=2, y=0), Point(x=2, y=1), Point(x=2, y=2)]
#[Point(x=2, y=0), Point(x=2, y=1), Point(x=2, y=2)]

结果应该是

#>>Output
#[Point(x=0, y=0), Point(x=0, y=1), Point(x=0, y=2)]
#[Point(x=1, y=0), Point(x=1, y=1), Point(x=1, y=2)]
#[Point(x=2, y=0), Point(x=2, y=1), Point(x=2, y=2)]

我不知道为什么,但下面的代码有效而上面的代码无效

for k in range(m):
    matrix[k] = [Point(k, i) for i in range(n)]

因为 [] * m 正在制作同一个列表的 m 个副本(它们引用同一个列表)。所以当你改变其中之一时,它会改变所有这些。 因此在最后,最后一行将覆盖您在之前填写的任何值。

将您的初始化更改为 matrix = [[[None] for i in range(n)] for j in range(m)],它将正常工作。

这里 another Whosebug answer 演示了以这种方式初始化二维数组的副作用。