2013-02-23 32 views
1

我創建了一個10×10的遊戲板。它是一個2D列表,裏面有另一個2的列表。我用 board = [[['O', 'O']] * 10 for x in range(1, 11)]。因此,它會產生類似二維Python列表將有隨機結果

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

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

後來我想設置一個單元格有‘C’我用board.gameBoard[animal.y][animal.x][0] = 'C' 板作爲類的遊戲鍵盤是和動物是一個棋子,X & y是剛剛整數。有時它會工作,指定的單元格將變成['C','O'],其他時候它會用['C','O'] ['C','O'] [ C','O'] ['C','O'] 有誰知道爲什麼可能會發生?

+0

相關:[乘法運算符應用於列表(數據結構)](http://stackoverflow.com/questions/974931/multiply-operator-applied-to-listdata-structure) – jfs 2013-02-23 03:28:31

回答

4

基本上,你要創建一大堆引用相同的列表 - 爲了演示,請考慮:

[ [] ]*10 

如果打印id S:

>>> 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) ] 
+0

完美,非常感謝你 – EasilyBaffled 2013-02-23 03:37:16

3

別擔心,很多人都陷入了和你一樣的陷阱。

[['O', 'O']] * 10創建the same list的10個副本。這意味着當您更改其中一個列表中的元素時,更改將反映在其他列表中。

做到這一點,而不是創建10名單獨的列表:

[[['O', 'O'] for j in range(10)] for i in range(10)] # or xrange in Python 2 
0

您的主板越來越相同的數組多次引用。 您需要將* 10替換爲另一個列表理解。