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