2013-10-13 60 views
5
array1=[0,1,2] 
array2=array1 
array2[0]=234234 
print array1 

OUTPUT:設置兩個數組等於

[234234, 1, 2] 

爲什麼蟒蛇變 '數組1'?不應該只是改變array2? 當我更改array2時,如何防止python更改array1?

+3

歡迎來到StackOverflow。不要太擔心downvoters - 有些人認爲每個重複或初學者問題都應該被低估。但除了重複之外,這是一個很好的問題:問題是什麼很清楚,並且它顯示了清楚地表明問題的簡潔代碼。 – kojiro

回答

4

使用切片表示法來複制這樣

array2 = array1[:] 

或者你可以使用list功能

array2 = list(array1) 

當你將一個列表到另一個列表中,將不會創建一個新的列表,但無論是變量將被引用到相同的列表中。這可以通過這個程序來確認。

array1 = [1, 2, 3, 4] 
array2 = array1 
print id(array1), id(array2) 

它們都會打印相同的ID。這意味着它們都是相同的(如果你來自C背景,你可以把它們看作是指針(在CPython實現中它們確實是指針,其他實現選擇打印唯一的ID - 請檢查小二的評論))。瞭解更多關於idhere。當你做

array3 = array1[:] 
array4 = list(array1) 
print id(array1), id(array3), id(array4) 

你會得到不同的ID,因爲在這些情況下將創建新的列表。

+0

+1 FWIW,'id's就像指針一樣是CPython特有的實現細節。如果Python解釋器不同,它們可能不是。但是在這種情況下,它們仍然保證具有相同的值,即使該值不是列表的內存地址。 – kojiro

+0

omg謝謝你我擁有你我的生活。也是你低估了我的人,因爲如果是這樣的話,我肯定會考慮收回前面的陳述。 – user2875270

+0

@ user2875270不可以。我沒有downvote :)這是我們都有的初學者問題。所以,我只是表示這個問題已經在另一個線索中得到了回答。 – thefourtheye

2

array1array2是同一列表中的兩個名稱,因爲這就是您設置它們的方式。如果你不希望這樣,複製使用下列方法之一名單:

array2 = array1[:] 
array2 = list(array1) 
10

array1array2同一個對象。這就是爲什麼要改變另一個。如果你想副本對象,這裏是應該做的一種方式:

array2 = array1[:] 

more on this here