代码之家  ›  专栏  ›  技术社区  ›  Jesse Aldridge

这是怎么回事?随机列表中的重复行

  •  1
  • Jesse Aldridge  · 技术社区  · 14 年前

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

    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 回复  |  直到 14 年前
        1
  •  2
  •   a_m0d    14 年前

    我认为这是因为当您调用

    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个独立的列表。