0

私のコードでは、次のgamelistように定義されたネストされたリストがあります

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'], []]]

連続する各移動の後など。

私の問題は、ゲームリストがコピーされている間、その中にネストされたリストがコピーされず、pastmoves2 回の移動後に次のようになることです。

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

最下位レベルの値もすべてコピーされ、変更として静的なままになるようにしたいと思いgamelistます。どうすればそれを達成できますか?

4

4 に答える 4

2
from copy import deepcopy

pastmoves.append(deepcopy(gamelist))
于 2013-02-25T17:10:23.397 に答える
1

copy.deepcopy()最も簡単な方法は、ネストされたリストでディープコピーを実行するために使用することです。

于 2013-02-25T17:10:34.687 に答える
1

の代わりにcopy.deepcopy()、リスト内包表記を使用してこれを行う方法を次に示します。

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

これは1レベルのネストでのみ機能することに注意してください。任意にネストされたリストがある場合copy.deepcopy()は、間違いなくその方法です。

于 2013-02-25T17:11:55.300 に答える
0

単純:pastmoves.append( list(gamelist[:]) )

これで、新しいオブジェクトが生成されるたびに

于 2013-02-25T17:13:47.603 に答える