使用namedtuples填充矩阵

时间:2017-10-09 06:12:51

标签: python-3.x matrix namedtuple

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

索引不正确

如何解决?

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)]

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)]