Python - 动态嵌套列表

标签 python list nested

因此,我尝试根据宽度和高度在 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']]

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

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

最佳答案

当您执行 [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]

关于Python - 动态嵌套列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3587215/

相关文章:

python - 获取过滤子列表项的线性索引

python - 通过迭代重命名Python嵌套字典中的键和子键

python - 使用合并排序合并和排序列表

python - Pandas 数据帧 : averaging values in one col because another col has duplicates

c++ - 双向链表,tail 的问题

javascript - javascript中的嵌套类,私有(private)方法的继承

Java:嵌套类可以解决这个问题吗?

python - 使用 pandas 按列值分组条形图

python - 将文件名拆分为part1和part2并创建目录part1并将文件part2放入part1目录的脚本

python - 如何删除列表中的多个字符?