用命名元组填充矩阵
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 演示了以这种方式初始化二维数组的副作用。
为什么矩阵中充满了这样的命名元组?
索引插入不正确
如何解决?
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 演示了以这种方式初始化二维数组的副作用。