在以下代碼中:
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 而不是串列。
uj5u.com熱心網友回復:
在您的第一個示例中,變數被分配給與參考(第二個陣列)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.]])]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/488944.html
