【问题标题】:What's going on here? Repeating rows in random list of lists这里发生了什么?在列表的随机列表中重复行
【发布时间】:2010-06-14 00:29:36
【问题描述】:

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

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

【问题讨论】:

  • 啊,没关系。问题是我创建网格的方式使每一行都成为对同一个列表的引用。如果将行更改为 grid = [[0] * ncols for row in range(ncols)],它会起作用

标签: python random multidimensional-array


【解决方案1】:

我认为这是因为 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 个独立的列表。

【讨论】:

    猜你喜欢
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2013-11-03
    • 2020-04-10
    相关资源
    最近更新 更多