在以下代码中:
E=np.zeros((2,2))
H=np.zeros((2,2))+1
L=[]
L.append(E)
E=H
L.append(E)
print(L)
的输出是我所期望的:
[array([[0., 0.],
[0., 0.]]), array([[1., 1.],
[1., 1.]])]
即L[0]在第二次追加后保持不变。但是,对于代码:
E=np.zeros((2,2))
H=np.zeros((2,2))+1
L=[]
L.append(E)
E[0,0]=H[0,0]
L.append(E)
print(L)
输出为
[array([[1., 0.],
[0., 0.]]), array([[1., 0.],
[0., 0.]])]
即L[0]在第二次追加后发生了变化。有人能解释一下为什么会有不同吗?我知道附加E.copy()更安全,但我不明白差异的来源是什么,因为E[0,0]是numpy而不是list。
在您的第一个示例中,变量E
被分配给H
所指的相同数组(第二个数组)。E
与第一个数组的原始关系被简单地覆盖。这就是为什么第一个列表元素在第一个示例中不受影响的原因。在第二个示例中,您更改了E
所引用的数组的内容,并且该列表的第一个条目也已被分配给该数组。因此它改变了。
=
在python中的作用是相当明确的。只要给一个变量赋一些引用。无论之前提到的变量是什么,都无关紧要。
通过建议使用copy
追加到列表,您已经有了答案。如果您想跟踪使用的矩阵,那么无论如何都必须存储每个矩阵的副本。否则他们会迷路的。所以:
E = np.zeros((2,2))
L = [E.copy()]
E[0,0] = 1
L.append(E.copy())
会给你
[array([[0., 0.],
[0., 0.]]),
array([[1., 0.],
[0., 0.]])]