2015-03-03 164 views
1

我設計了一個將列表作爲參數並返回另一個列表的函數。通過迭代列表追加項目

def function(list): 
    A = [] 
    B = [] 
    for num in list: 
     A.append(num) 
     B.append(A) 
    return B 

在這個函數中,我認爲函數會根據A的當前狀態將A附加到A.在這個假設下工作。我調用的函數

>>> test([1,2,3,4,5]) 

預期輸出爲

[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4], [1, 2, 3, 4, 5]] 

但是,我得到的是

[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]] 

爲什麼是這樣的結果呢?圍繞這個問題有什麼解決方案嗎?

+0

你正在做的是按引用傳遞,而不是A的價值內容的地址的時刻。因此最後它顯示了A的重複內容,而不是顯示存儲時的值。 基本pythonic的方式來做到這一點。正如@Paul Lo建議/回答。 並沒有這不是一個問題,但一個基本的python「屬性」 – smitkpatel 2015-03-03 06:25:22

回答

2

可以的A拷貝追加到B避免使用的A相同的參考:

for num in list: 
     A.append(num) 
     B.append(A[:]) 
3

你需要按值複製。在你目前的情況下,你通過參考傳遞。因此,每個索引都會更新爲A更改。應該是:

B.append(A[:]) 

通知的[:]用於複製的價值。

爲了澄清,running your code here我們可以檢查調用function[1,2]結果:

Zalgo the pony is watching.

現在,考慮會發生什麼,當我們做一個副本:

def function(list): 
    A = [] 
    B = [] 
    for num in list: 
     A.append(num) 
     B.append(A[:]) 
    return B 

print function([1,2]) 

3 copies, to rule them all.

另外,作爲一個附註:你應該改變名稱你的變量。例如,通過將參數聲明爲list,您將影響list方法。

+0

很短的時間內一個很好的和詳細的教程! – 2015-03-03 06:26:10

+2

@PaulLo:謝謝。 :)但大部分的功勞應該歸功於那些製作漂亮程序的人,這些人很容易想象這些照片! (www.pythontutor.com) – Dair 2015-03-03 06:45:30

2

列表通過引用傳遞。要複製他們使用的語法B.append(A[:])

def function(list): 
    A = [] 
    B = [] 
    for num in list: 
     A.append(num) 
     B.append(A[:]) 
    return B 
2

在你的代碼發送引用,而不是數據。

工作代碼

def function(list): 
    A = [] 
    B = [] 
    for num in list: 
     A.append(num) 
     B.append(A[:]) 
    return B