2013-04-01 53 views
4

大家好我很抱歉,如果這是一個noob問題,但我使用python和我有一個問題,我複製一個數組,但然後當我修改它影響原件的副本。我想一個線性從邊界矩陣偏移添加到一組座標:Python修改數組副本影響原始?

boundaries = [[5.818, 0.0, 0.0], [0.0, 5.818, 0.0], [0.0, 0.0, 5.818]] 

xyzCoord = [[0.0, 0.0, 0.0], [2.909, 2.909, 0.0], ... 

extraX=[] 
for i in range(0,len(xyzCoord)): 
    toAdd=[] 
    toAdd=xyzCoord[i] 
    toAdd[0]=toAdd[0]+boundaries[0][0] 

print xyzCoord 

我期望的輸出是xyzCoord應該不會受到影響,因爲我做重複(TOADD),然後修改。奇怪的是這個循環會影響我的xyzCoord:

輸出是:

[[5.818, 0.0, 0.0], [0.0, 5.818, 0.0], [0.0, 0.0, 5.818]] 

[[0.0, 0.0, 0.0], [2.909, 2.909, 0.0], ... 

[[5.818, 0.0, 0.0], [8.727, 2.909, 0.0], ... 

編輯:對於背景下,這個想法是,我希望最終能與轉置值,然後一個單獨的列表最終創建一個插入列表,但這部分阻止了我。即我希望創建: [[0.0,0.0,0.0],[5.818,0.0,0.0],[2.909,0.0,0.0],[8.727,2.909,0.0] ...] ,然後製作更大循環爲Y和Z.這樣我可以在XY和Z中傳播一些座標和任意次數。

回答

7

這是關於Python最令人驚訝的事情之一 - =操作員從不復制任何東西!它只是將一個新名稱附加到現有對象上。

如果您想製作一個列表的副本,您可以使用該列表的一部分;切片運算符複製。

toAdd=xyzCoord[i][:] 

您還可以使用copydeepcopycopy module使對象的副本。

+0

感謝您的幫助,這完全奏效! – Coherent

1

toAdd不重複。以下品牌toAdd指同一子列表作爲xyzCoord[i]

toAdd = xyzCoord[i] 

當您更改toAdd元素,xyzCoord[i]相應的元素也隨之變化。

相反以上,寫的:

toAdd = xyzCoord[i][:] 

這將使(淺)副本。

+0

還有'copy.deepcopy()'。 –

+0

你真了不起,非常感謝你! – Coherent

+1

有些人更喜歡顯式的'list(xyzCoord [i])',它更像是「構建一個*新的*列表請」,而不是從開始到結束切片的隱式拷貝。前者速度較慢(儘管這很少引起關注)。 – mgilson

0

因爲您使用的是數組數組(列表列表),所以內部列表是一個對象,因此您只複製內部對象的引用而不是複製值。