-1

我正在尝试制作一个 5x5 网格,其中玩家被放置在随机位置。

def board():
    grid0 = []
    grid1 = []
    a = 0
    b = 0
    while a < 5:
        grid0.append("0")
        a += 1
    while b < 5:
        grid1.append(grid0)
        b += 1
    x = list(grid1)
    x[0][0] = "x"
    for row in grid1:
        print(row)

我希望结果如下所示:

['X', '0', '0', '0', '0']
['0', '0', '0', '0', '0']
['0', '0', '0', '0', '0']
['0', '0', '0', '0', '0']
['0', '0', '0', '0', '0']

但相反,我得到了这个:

['x', '0', '0', '0', '0']
['x', '0', '0', '0', '0']
['x', '0', '0', '0', '0']
['x', '0', '0', '0', '0']
4

4 回答 4

0

如果您想要一个 5x5 的网格,在随机位置充满'0'with 'x',您可以执行以下操作:

from random import randint


grid = [['0' for x in xrange(5)] for y in xrange(5)]
grid[randint(0,4)][randint(0,4)] = 'x'
于 2019-06-26T23:04:13.090 回答
0

这是多个引用同一个可变列表的经典 python gotchya。您想创建 unqiue 列表:

from pprint import pprint

x = []
for _ in range(5):
    x.append(['0']*5)

x[0][0] = 'x'

pprint(x)

给出输出:

[['x', '0', '0', '0', '0'],
 ['0', '0', '0', '0', '0'],
 ['0', '0', '0', '0', '0'],
 ['0', '0', '0', '0', '0'],
 ['0', '0', '0', '0', '0']]
于 2019-06-26T23:04:45.350 回答
0

原因是您构建网格的方式。您的列表“x”是对“grid0”的 5 个引用的列表。当您通过调用 x[0][0] ='x' 覆盖列表“x”的第零个元素的第零个元素时,您将覆盖代表“grid1”的每个元素的“grid0”的第零个元素,并且因此,您的列表“x”。您将需要找到另一种方法来构建网格并研究如何生成单个实例(例如,通过使用 copy() )

于 2019-06-26T23:04:51.570 回答
0

您的代码的问题是您将 grid0 的相同副本附加到您的 grid1 列表中。这意味着您对 grid1[0] 中的 grid0 所做的任何更改都会影响您的 grid0[1:4](因为它们都是相同的 grid0)。

您可以通过将 grid0 的副本附加到 grid1 来轻松解决此问题:

    while b < 5:
        grid1.append(grid0.copy())
        b += 1
于 2019-06-26T23:04:59.393 回答