这个数组赋值是怎么回事?

2024-10-01 02:34:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试用Python制作一个基于终端的扫雷舰克隆。以下是我生成雷区的函数:

BOMB = '#' # The symbol for the bomb
def generateField(width, height, bombs):
    field = [[0] * height] * width # Make the empty array grid
    for bomb in range(0, bombs):
        x, y = random.randint(0, width - 1), random.randint(0, height - 1)
        print((x, y)) # For debugging, remove later
        field[x][y] = BOMB #
    return field

还没有完成。 然而,当我调用generateField(12,12,12)来获取一块宽度为12,高度为12,宽度为12的板时,它给出了如下结果:

[
    [0, '#', 0, 0, 0, '#', '#', '#', 0, '#', '#', '#'], 
    [0, '#', 0, 0, 0, '#', '#', '#', 0, '#', '#', '#'], 
    [0, '#', 0, 0, 0, '#', '#', '#', 0, '#', '#', '#'], 
    [0, '#', 0, 0, 0, '#', '#', '#', 0, '#', '#', '#'], 
    [0, '#', 0, 0, 0, '#', '#', '#', 0, '#', '#', '#'], 
    [0, '#', 0, 0, 0, '#', '#', '#', 0, '#', '#', '#'],
    [0, '#', 0, 0, 0, '#', '#', '#', 0, '#', '#', '#'], 
    [0, '#', 0, 0, 0, '#', '#', '#', 0, '#', '#', '#'], 
    [0, '#', 0, 0, 0, '#', '#', '#', 0, '#', '#', '#'], 
    [0, '#', 0, 0, 0, '#', '#', '#', 0, '#', '#', '#'], 
    [0, '#', 0, 0, 0, '#', '#', '#', 0, '#', '#', '#'], 
    [0, '#', 0, 0, 0, '#', '#', '#', 0, '#', '#', '#']
]

有人能给我解释一下发生了什么事,或是出了什么问题吗


Tags: the终端fieldfor宽度randomwidthheight
1条回答
网友
1楼 · 发布于 2024-10-01 02:34:24

这部分引起了麻烦:

field = [[0] * height] * width

请尝试以下操作:

field = [[0] * height for _ in xrange(width)]

说明:您正在将相同的引用复制到列表中的单个子列表,因此对一个元素所做的任何更改都将反映在“其他”元素上-因为实际上,只有一个单个子列表被引用了多次

我建议的解决方案负责每次创建不同的子列表(使用列表理解),因此不会共享子列表引用。这是Python中一个相当常见的问题,请查看post以了解更多详细信息

相关问题 更多 >