2012-01-21 105 views
0

我知道列表L可以通過執行L [:]來複制。但是我面臨一個我不明白爲什麼的問題。Python列表副本

src = [1,2,3] 
dest = [[5,6,7]] 
dest.append(src[:].append(4)) 
dest 
[[5, 6, 7], None] 

在上述樣品中,SRC列表不被複制至目的(見無)當我試圖複製和追加4到它。

dest.append(src[:]) 
dest 
[[5, 6, 7], None, [1, 2, 3]] 

可以看出在上面的代碼片段,如果我添加只需添加清單(DEST)沒有任何附加的嘗試,它就會被插入。 有什麼想法?

+0

你需要什麼樣的最終結果? [[5,6,7],[1,2,3]]?或[5,6,7,1,2,3]? – zengr

+0

@zengr,[[5,6,7],[1,2,3,4]]。問題是'append'不返回修改後的列表(它返回None)。 –

回答

7

append試圖做的是在給定列表上附加數據並返回None

這就是爲什麼你會在dest的末尾看到None

下面的代碼應該做你想要什麼:

dest.append(src + [4]) 
3

功能/修飾的參數的方法/對象就地應該返回None。這是Python中的一個常見約定。例如,.append(),.extend(),random.shuffle();一個明顯的例外是.pop()

由於@qiao already said你可以使用:

dest.append(src + [4]) 

或者

dest += [src + [4]] 

src + [4]創建一個新的列表:[1,2,3,4],所以你不需要做出明確src副本。

+0

好的。現在我明白了。感謝Rob和Sebastian。 – sachin2182

+0

問題,你知道爲什麼存在這樣的約定嗎?也許這是因爲我也習慣於Javascript,但是返回'self'似乎比'None'更有用。這只是BDFL的偏好嗎? – voithos

+1

它旨在確保您避免意外使用變異方法而不意識到變異造成的錯誤。例如,如果'list#sort'返回了列表,那麼你可以錯誤地調用'foo(my_list.sort())'(當你應該寫'foo(sorted(my_list))')時,然後有問題因爲'my_list'在調用之後仍然被排序(而不是讓'foo'使用排序後的副本)。 –