在Python中重新赋值二维列表的行/列
我想在Python中创建一个二维列表,大小是 x + 1 和 y + 1,并且有一些初始值。初始值是第一行包含从 0 到 'x' 的数字,第一列包含从 0 到 'y' 的数字(包括这两个数字)。
假设 x 和 y 分别是 3 和 4。
所以我这样写:
listName = [range(0, x + 1)] * (y + 1);
这样我得到了一个二维列表,它有 5 行,每一行都是一个包含从 0 到 3 的数字的列表,这样每一行就有 4 个索引(4 列):
[[0, 1, 2, 3],
[0, 1, 2, 3],
[0, 1, 2, 3],
[0, 1, 2, 3],
[0, 1, 2, 3]]
我知道此时我有了一个二维数组,但每一行都是同一个实例,所以如果我在某一行修改了值,所有行都会反映这个变化。为了修复这个问题,我决定给每一行设置一个新的独特列表:
for row in listName:
row = range(0, x + 1);
但是我发现这似乎没有效果,我的原始列表没有改变。即使我这样做:
for row in listName:
row = ["A", "B", "C", "D"];
在赋值之前和之后打印显示 'row' 是在改变的,但在循环外面,当我打印时,我得到的还是我的原始列表。虽然我找到了另一种方法来实现我的目标,但我还是搞不清楚为什么会这样。有什么想法吗?
3 个回答
0
但是我注意到这似乎没有任何效果,我原来的列表
因为 row = range(0, x + 1)
并不是说“把 row
现在指向的内容替换成列表 range(0, x + 1)
的内容”;而是说“row
这个名字不再指向它现在指向的东西,而是指向列表 range(0, x + 1)
”。
0
当你把一个列表赋值给一个名字时,其实是在创建一个新的列表。Python有一种特别的写法可以让你做到这一点:
row[:] = …
>>> listName = [range(0, x + 1)] * (y + 1);
>>> listName
[[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]
>>> for row in listName:
... row[:] = range(0, x+1)
...
>>> listName
[[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]
>>> for row in listName:
... row[:] = range(0, x+6)
...
>>> listName
[[0, 1, 2, 3, 4, 5, 6, 7, 8], [0, 1, 2, 3, 4, 5, 6, 7, 8], [0, 1, 2, 3, 4, 5, 6, 7, 8], [0, 1, 2, 3, 4, 5, 6, 7, 8], [0, 1, 2, 3, 4, 5, 6, 7, 8]]
不过根据你最开始的问题,你是想这样做吗?
>>> [range(0, x+1)] + [[i] + [0]*x for i in xrange(1, y+1)]
[[0, 1, 2, 3], [1, 0, 0, 0], [2, 0, 0, 0], [3, 0, 0, 0], [4, 0, 0, 0]]
1
通过切片赋值来修改现有的列表,而不是仅仅重新绑定名称。
row[:] = ...
另外,你的构造方式不对。
listName = [range(0, x + 1) for z in range(y + 1)]