1

10 x 10 のゲーム ボードを作成しました。これは 2D リストで、内部に 2 つの別のリストがあります。使用し board = [[['O', 'O']] * 10 for x in range(1, 11)]ました。したがって、次のようなものが生成されます

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

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

後で、「C」を持つように単一のセルを設定したいと思いますboard.gameBoard[animal.y][animal.x][0] = 'C' 。board は gameBoard が含まれるクラスであり、animal はゲームのピースであり、x & y は単なる int です。機能し、指定されたセルが ['C', 'O'] になる場合もあれば、行全体を ['C', 'O']['C', 'O'][' で埋める場合もあります。 C', 'O']['C', 'O'] なぜそれが起こっているのか誰か知っていますか?

4

3 に答える 3

4

基本的に、同じリストへの大量の参照を作成しています -- 実証するには、次のことを考慮してください。

[ [] ]*10

sを印刷する場合id:

>>> print map(id,[ [] ]*10)
[958336, 958336, 958336, 958336, 958336, 958336, 958336, 958336, 958336, 958336]

それらはすべて同じであることがわかります。

最も簡単な修正は、次のようなことです。

[ [['O','O'] for _ in range(10)] for x in range(1, 11) ]
于 2013-02-23T03:27:54.153 に答える
3

心配しないでください。多くの人があなたと同じ罠に陥っています。

[['O', 'O']] * 10同じリストのコピーを 10 個作成します。つまり、リストの 1 つの要素を変更すると、その変更が他のすべてのリストに反映されます。

代わりにこれを実行して、10 個の個別のリストを作成します。

[[['O', 'O'] for j in range(10)] for i in range(10)]  # or xrange in Python 2
于 2013-02-23T03:28:00.393 に答える
0

ボードが同じ配列への複数の参照を取得しています。* 10を別のリスト内包表記に置き換える必要があります。

于 2013-02-23T03:29:13.727 に答える