gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:02:11 25 4
gpt4 key购买 nike

我一直在尝试用 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

还没有完成。然而,当我为宽度为 12、高度为 12、宽度为 12 的炸弹调用generateField(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, '#', '#', '#']
]

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

最佳答案

这部分造成了麻烦:

field = [[0] * height] * width

试试这个:

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

解释:您正在将相同引用复制到列表中的单个子列表,因此对一个元素所做的任何更改都将反射(reflect)在“其他”元素上 - 因为事实上,只有一个单个被引用多次的子列表。

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

关于python - 这个数组赋值是怎么回事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25836039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com