为什么这个python列表只存储最后的输入元素



请解释以下行为

import sys
input=sys.stdin.readline
for _ in range(int(input())):
n=int(input())
m=int(input())
vertices=[[0, 0]]*n
edges=[[0, 0, 0]]*m
for i in range(m):
edges[i][0], edges[i][1], edges[i][2]=list(map(int, input().split()))
for i in range(m):
print(edges[i][0], edges[i][1], edges[i][2])

当以下输入输入到程序中时:

1
5
7
1 2 1
2 3 2
2 4 6
5 2 1
5 1 3
4 5 2
3 4 3

正在生成此输出:

3 4 3
3 4 3
3 4 3
3 4 3
3 4 3
3 4 3
3 4 3

为什么只有最后的输入存储在所有元素中?

让我们看看这个解释器会话:

>>> a = [[0,0,0]] * 5
>>> a
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> a[0][0] = 1
>>> a
[[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]]

这实际上是Python中常见的陷阱。代码转换为类似这样的东西

inner = [0, 0, 0]
a = [inner, inner, inner, inner, inner]

这种编写方式可以更清楚地表明,您实际上创建了一个列表,其中所有条目都指向同一对象(inner(。

解决此问题的一种方法是使用列表推导式,这样将为每个列表条目创建一个新的内部列表:

vertices=[[0, 0] for _ in range(n)]
edges=[[0, 0, 0] for _ in range(m)]

另一个解决方法是使用 numpy 并使用numpy.zeros(n, 2)声明 2D 矩阵。Numpy 通常对于数学/数字密集型应用程序很有用。

相关内容

  • 没有找到相关文章

最新更新