请解释以下行为
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 通常对于数学/数字密集型应用程序很有用。