【问题标题】:Python - Dynamic Nested ListPython - 动态嵌套列表
【发布时间】:2011-04-04 23:20:04
【问题描述】:

所以我试图在 Python 中根据宽度和高度生成一个嵌套列表。这是我目前所拥有的:

    width = 4
    height = 5
    row = [None]*width
    map = [row]*height

现在,这显然不太正确。打印出来看起来不错:

[[None, None, None, None],
 [None, None, None, None],
 [None, None, None, None],
 [None, None, None, None],
 [None, None, None, None]]

但试图为这样的位置赋值:

map[2][3] = 'foo'

我明白了:

[[None, None, None, 'foo'],
 [None, None, None, 'foo'],
 [None, None, None, 'foo'],
 [None, None, None, 'foo'],
 [None, None, None, 'foo']]

很明显,这是因为每个子列表实际上只是引用同一个对象、行,因此更改一个对象会更改它们。所以这是我得到的最接近的!

如何动态生成嵌套列表?谢谢!

【问题讨论】:

  • 虽然不是完全重复,但请参阅:stackoverflow.com/questions/1605024/…
  • map() 是一个内置函数,重写它不是一个好主意。查找其他名称,如果需要,您可以附加 _

标签: python list nested


【解决方案1】:

当您执行[row]*height 时,您最终会在每一行中得到相同的列表对象。 row 数组引用在每一行中重复,这意味着每一行实际上都指向同一个列表对象。因此,修改一行实际上会修改所有行。

看看当您为每一行打印id() 时会发生什么。他们都是一样的!

>>> grid = [[None] * width] * height
>>> [id(row) for row in grid]
[148014860, 148014860, 148014860, 148014860, 148014860]

您可以使用列表推导式让 python 为每一行生成单独但相同的列表。当您使用 [rowexpr for i in xrange(height)] 时,rowexpr 将每行评估一次。诀窍是使用一个表达式,每次计算时都会产生一个唯一的列表。

如果您在实际中看到它会更有意义:

>>> grid = [[None] * width for i in xrange(height)]
>>> grid[2][3] = 'foo'
>>> grid
[[None, None, None, None],
 [None, None, None, None],
 [None, None, None, 'foo'],
 [None, None, None, None],
 [None, None, None, None]]

每次评估[None] * width 时,它都会生成一个新列表。

>>> [id(row) for row in grid]
[148016172, 148015212, 148016236, 148016108, 148016332]

【讨论】:

    【解决方案2】:

    我使用这样的东西:

    w = 5
    h = 5
    
    map = []
    
    for i in range(h):
     row = []
     for j in range(w):
      row.append(None)
     map.append(row)
    
    print map
    
    map[2][3] = 'foo'
    
    print map
    

    【讨论】:

    • 我同意,列表理解更简洁、更易读、更“Pythonic”。我的方式只是解决问题的一种方式,对于仍在从 C 进化到 python 的人(比如我)来说也是可读的。
    • 使用嵌套的 for 循环并不能帮助您或其他任何人从 C 语言过渡到 python:它只会妨碍您。
    猜你喜欢
    • 2013-01-29
    • 2021-10-29
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多