2013-02-25 70 views
0

在我的代碼,我有嵌套列表gamelist,定義爲的Python:追加嵌套列表的副本列出

gamelist = [['3'], ['2'], ['1']] 

該計劃的目的是處理內部列表作爲堆棧,附加小元素包含較大元素或空堆棧的堆棧,在列表中清掃和不重複移動。理論上這個遊戲應該去:

[['3'], ['2'], ['1']] 
[['3'], ['2', '1'], []] 
[['3', '1'], ['2'], []] 
[['3', '1'], [], ['2']] 

依此類推,直到列表排序從最小到最大。

爲了檢查當前的移動對先前的移動,我創建了pastmoves,每移動後都有一個gamelist的副本。

pastmoves.append(gamelist[:]) 

所以pastmoves後應

[[['3'], ['2'], ['1']]] 
[[['3'], ['2'], ['1'], [['3'], ['2', '1'], []]] 

等各個連續移動閱讀。

我的問題是,雖然遊戲列表被複制,列表嵌套在其中都沒有了,pastmoves看起來是這樣的後兩個動作:

[[['3'], ['2', '1'], []], [['3'], ['2', '1'], []]] 

我想使它使所有的底層值也是副本,並保持靜態,因爲gamelist更改。我怎樣才能做到這一點?

回答

2
from copy import deepcopy 

pastmoves.append(deepcopy(gamelist)) 
+1

我想我應該通過標準庫可能讀取。非常感謝您的幫助。 – user1576628 2013-02-25 17:15:16

1

最簡單的方法就是使用copy.deepcopy()在嵌套列表上進行深層複製。

1

作爲替代copy.deepcopy(),這裏是你如何與列表理解這樣做:

pastmoves.append([inner[:] for inner in gamelist]) 

請注意,這僅適用於一級嵌套工作,如果你有任意嵌套列表,然後copy.deepcopy()是絕對是要走的路。

+0

有趣的價值返回。 'pastmoves'讀取[[<發生器對象 at 0x026E2E18>]'。我從來沒有使用過列表推導,所以我不知道這裏發生了什麼。 – user1576628 2013-02-25 17:26:00

+0

您是否包含方括號? – 2013-02-25 17:31:08

+0

看起來像我忘了。它現在工作正常,謝謝。 – user1576628 2013-02-25 17:33:23

0

簡單:pastmoves.append(list(gamelist[:]))

現在每次有新對象將BEW產生

+0

這導致了同樣的問題,我不知道爲什麼。 – user1576628 2013-02-25 17:20:40

+0

'list(gamelist)'將和'gamelist [:]'做同樣的事情,都是淺拷貝。 'list(gamelist [:])'只會執行一次淺拷貝,並且結果的內部列表將與來自'gamelist'的列表具有相同的標識。 – 2013-02-25 17:42:24

+0

我的測試顯示有點不同的結果: >>> a = [[1],[2],[3]] >>> b = list(a) >>> a [[1],[ [1],[3]] [b] [1],[3] 2],[3]] >>> b [[1],[8],[3]] – WBAR 2013-02-26 09:19:19