2012-06-20 45 views
2

我在Python中for循環有奇怪的行爲。這個問題不完全是這一個,但很相似:如何修改這個python for循環?

a = [] 
b = [1,2,3,4] 
for i in xrange (0,10): 
    a.append(b) 
    b[3] += 1 

,其結果是:

a = [[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14],[1,2,3,14]] 

我期待的結果是

a = [[1,2,3,4],[1,2,3,5],[1,2,3,6],[1,2,3,7],.....,[1,2,3,14]] 

我不知道爲什麼在每次迭代中,b [3]被添加到14,然後列表[1,2,3,14]被添加到a。我認爲b [3]在每次迭代中只應該增加1

+2

這是因爲,要附加一個參考'B'到了''在循環的每次迭代中,不是'b'的副本。每個引用指向同一個'b',在你的循環結束時,'b [3] = 14'。 – Chris

+3

嘗試在[此Python代碼可視化工具](http://people.csail.mit.edu/pgbovine/python/tutor.html#mode=edit)中粘貼代碼以查看究竟發生了什麼。 –

+0

那麼我該如何解決它? – cuongptnk

回答

7

你的問題是每次迭代都會對同一個數組附加一個引用,並不斷改變它。

最簡單的解決方法是追加更改爲

a.append(list(b)) 

這將使每一次迭代追加(淺)拷貝到目標陣列,代替參考。

4

b通過引用進行訪問,所以當您修改b[3]時,它會影響您一再重複附加到a的每個引用。爲了解決這個問題,你只需要創建的b新副本每次:

a = [] 
b = [1,2,3,4] 
for i in xrange (0,10): 
    a.append(b[:]) 
    b[3] += 1 
+0

列表(b)更適合b [:]新手友好的語法 –

2

您可以使用deepcopy

from copy import deepcopy 
a = [] 
b = [1,2,3,4] 
for i in xrange (0,10): 
    a.append(deepcopy(b)) 
    b[3] += 1