gpt4 book ai didi

python - 这里发生了什么?在随机列表列表中重复行

转载 作者:行者123 更新时间:2023-12-01 06:16:34 25 4
gpt4 key购买 nike

我希望得到一个由唯一的随机数组成的网格。相反,每一行都是相同的数字序列。这是怎么回事?

from pprint import pprint
from random import random

nrows, ncols = 5, 5
grid = [[0] * ncols] * nrows
for r in range(nrows):
for c in range(ncols):
grid[r][c] = int(random() * 100)
pprint(grid)

示例输出:

[[64, 82, 90, 69, 36],
[64, 82, 90, 69, 36],
[64, 82, 90, 69, 36],
[64, 82, 90, 69, 36],
[64, 82, 90, 69, 36]]

最佳答案

我认为这是因为Python在调用时使用了列表的弱副本

grid = [...] * nrows

我尝试对列表进行硬编码,它工作正常:

>>> grid = [[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]]
>>> for r in range(nrows):
... for c in range(ncols):
... grid[r][c] = int(random() * 100)
...
>>> pprint(grid)
[[67, 40, 41, 50, 92],
[26, 42, 64, 77, 77],
[65, 67, 88, 77, 76],
[36, 21, 41, 29, 25],
[98, 77, 38, 40, 96]]

这告诉我,当 python 复制列表 5 次时,它所做的只是存储 5 个指向第一个列表的指针 - 然后,当您更改该列表中的值时,实际上只是更改第一个列表中的值它会反射(reflect)在指向该列表的所有列表中。

使用您的方法,您无法独立更新所有列表。

相反,我建议更改您的列表生成行,使其看起来更像这样:

grid = [[0] * ncols for row in range(ncols)]

这应该为您创建 5 个独立的列表。

关于python - 这里发生了什么?在随机列表列表中重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3034469/

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