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

时间:2010-06-14 00:29:37

标签: python random multidimensional-array

我希望获得一个独特的随机数网格。相反,每一行都是相同的数字序列。这是怎么回事?

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]]

1 个答案:

答案 0 :(得分:2)

我认为这是因为当你调用

时,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个指向第一个列表的指针 - 然后,当你更改该列表中的值时,实际上只是更改了第一个列表中的值它会反映在指向那一个的所有列表中。

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

相反,我建议将列表生成行更改为更像这样:

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

那应该为你创建5个独立的列表。