【问题标题】:2D Python list will have random results2D Python 列表会有随机结果
【发布时间】:2013-02-08 19:25:47
【问题描述】:

我创建了一个 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'] 有谁知道为什么会发生这种情况?

【问题讨论】:

标签: python list


【解决方案1】:

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

[ [] ]*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) ]

【讨论】:

    【解决方案2】:

    别担心,很多人都和你一样落入了陷阱。

    [['O', 'O']] * 10 创建 10 个 the same list 副本。这意味着当您更改其中一个列表中的元素时,更改会反映在所有其他列表中。

    改为创建 10 个单独的列表:

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

    【讨论】:

      【解决方案3】:

      您的电路板正在获得对同一个数组的多个引用。 您需要将 * 10 替换为另一个列表理解。

      【讨论】:

        猜你喜欢
        • 2013-07-09
        • 2015-02-16
        • 1970-01-01
        • 2022-06-15
        • 2016-10-03
        • 2016-03-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-15
        相关资源
        最近更新 更多