第二次追加numpy数组来更改列表中的第一个条目



在以下代码中:

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.]])]

相关内容

最新更新