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 只是整数。有时它会起作用,指定的单元格将变为 ['C', 'O'],其他时候它将用 ['C', 'O']['C', 'O'][' 填充整行C', 'O']['C', 'O'] 有谁知道为什么会发生这种情况?

4

3 回答 3

4

基本上,您正在创建一大堆对同一个列表的引用——为了演示,请考虑:

[ [] ]*10

如果您打印ids:

>>> 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 个副本。这意味着当您更改其中一个列表中的元素时,更改会反映在所有其他列表中。

改为创建 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 回答