为什么矩阵充满了像这样的命名元组?
索引不正确
如何解决?
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)]
答案 0 :(得分:2)
因为[] * m
正在制作同一列表的m
个副本(它们引用相同的列表)。因此,当您更改其中一个时,它会更改所有这些内容。
因此,在最后一行,最后一行覆盖了之前填写的任何值。
将初始化更改为matrix = [[[None] for i in range(n)] for j in range(m)]
,它会正常工作。
这里another StackOverflow answer展示了以这种方式初始化2D阵列的副作用。
答案 1 :(得分:0)
我不知道为什么,但下面的代码可以使用,而不是
for k in range(m):
matrix[k] = [Point(k, i) for i in range(n)]