4

2 次元リストとして表される Python 2.7 の 5x5 グリッドであるゲームボードを構築しようとしています。board = [["O"]*cols]*rows(列と行はすでに5であると宣言されています)と書いてみましたが、インデックスの値を編集しようとすると、行全体が変更されます。例えば

cols = 5
rows = 5
board = [["O"]*cols]*rows

これは次のように表示されます:

[['O', 'O', 'O', 'O', 'O'], ['O', 'O', 'O', 'O', 'O'], ['O', 'O', 'O', 'O', 'O'], ['O', 'O', 'O', 'O', 'O'], ['O', 'O', 'O', 'O', 'O']]

今、次のようなインデックスの値を変更しようとすると:

board[1][1] = "X"

それは印刷します:

[['O', 'X', 'O', 'O', 'O'], ['O', 'X', 'O', 'O', 'O'], ['O', 'X', 'O', 'O', 'O'], ['O', 'X', 'O', 'O', 'O'], ['O', 'X', 'O', 'O', 'O']]

行 1 列 1 の値のみを変更したい。

また、次のことも試しました。

board = []
for i in xrange(5):
    board.append(["O"]*cols)

これは私が望むように機能します。私が理解したいのは、違いは何ですか?

4

3 に答える 3

5

以下の式を評価すると、最初の例では True が返されますが、他の例では False が返されることがわかります。両方のリストは、実際にはメモリ内の同じ単一のリストを指しています。

board[0] is board[1]

明確な新しいリストを作成する短いバージョンが必要な場合は、このバージョンも正しく機能します。

board = [["O"]*cols for y in range(rows)]
于 2012-10-03T12:52:39.553 に答える
1

Pythonは暗黙のうちに物事をコピーする習慣がないからです。「それぞれがである[x] * 55つのもののリスト」を意味します。1つを変更すると、すべてが変更されます。これは、のコピーではなく、すべてであるためです。 xxx

を使用する場合.append()、ループを通過するたびに最初から追加する値を作成するため、強制的にコピーします。

はい、["O"] * 5それぞれが同じである5つのもののリストを作成し"O"ます。ただし、これは実際には関係ありません。"O"変更できないため、「異なる」などの意味のあるものはありません。名前を付ける変数"O"に何をしても、それはです。 "O""O""O"

于 2012-10-03T13:56:00.710 に答える
0

最初の式は、単一のリストオブジェクトへのポインターのリストを作成することです。したがって、1つの要素を更新すると、すべての要素が変更されます。

于 2012-10-03T12:48:52.953 に答える