Python 什么';这是怎么回事?在列表的随机列表中重复行

Python 什么';这是怎么回事?在列表的随机列表中重复行,python,random,multidimensional-array,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) 示例输出:

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

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

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

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

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

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

啊,没关系。问题是我创建网格的方式使每一行都指向同一个列表。如果将范围内的行(ncols)的行更改为grid=[[0]*ncols,则此选项有效