刚开始使用python,在填充列表时遇到了困难。
mat = [[0]*3]*4
for i in range(4):
for j in range(3):
mat[i][j] = (i,j)
print(mat)上面的代码打印出来:
[[(3, 0), (3, 1), (3, 2)],
[(3, 0), (3, 1), (3, 2)],
[(3, 0), (3, 1), (3, 2)],
[(3, 0), (3, 1), (3, 2)]]当我认为它应该打印出这样的东西:
[[(0, 0), (0, 1), (0, 2)],
[(1, 0), (1, 1), (1, 2)],
[(2, 0), (2, 1), (2, 2)],
[(3, 0), (3, 1), (3, 2)]]我意识到这可能是一个简单的问题,但我做错了什么?Everywhere online告诉我以这种方式填充列表。
提前感谢!
发布于 2020-04-17 02:59:16
当您创建原始数组时,矩阵的某些部分共享相同的引用:mat[0] is mat[1],=>,True!这将创建相同的数组,并重复对其的4个引用:[[0]*3]*4,因此,当您更改一个数组时,您将全部更改它们。
避免这种情况的一种方法是创建子数组:
mat = []
for i in range(4):
mat.append([])
for j in range(3):
mat[i].append((i,j))
print(mat)
# [[(0, 0), (0, 1), (0, 2)], [(1, 0), (1, 1), (1, 2)], [(2, 0), (2, 1), (2, 2)], [(3, 0), (3, 1), (3, 2)]]发布于 2020-04-17 03:03:06
mat = [[0]*3]*4.
mat[0][1] = 1
print(mat)如您所见,数组的所有行都已更改为与初始值匹配。这是因为在python中,创建列表的方式复制了相同的原始行,这意味着所有其他行都将指向相同的内存地址,因此它们都会受到影响。
若要解决此问题,请尝试以下操作:
mat=[[0]*3 for i in range(4)]这使得列表中的所有内容都是独立的。
https://stackoverflow.com/questions/61263374
复制相似问题