s
是一个整数列表列表,其中所有值都初始化为零。我想只将第一行的第一个元素递增1,但是以下命令将每行的第一个元素递增1。我怎么能实现这个目标?
In [6]: s = [[0]*4]*4
In [7]: s[0][0] += 1
In [8]: s
Out[8]:
[[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0]]
好!感谢您的建议,问题在于我的构建。
答案 0 :(得分:1)
如果s确实是列表列表(而不是包含对同一列表的多个引用的列表),那么您所做的工作,您的问题必须在其他地方
>>> s = [[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]]
>>> s[0][0]
0
>>> s[0][0] = 1
>>> s
[[1, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
答案 1 :(得分:1)
首先,您的列表“不正确”;列表中的每个元素只指向同一个列表。当您更新该列表时,它们都会更新。
使用类似的代码制作列表列表:
s = [[0 for _ in range(5)] for _ in range(5)]
答案 2 :(得分:1)
这是经典的Python监督,因为列表分配是通过引用而非深层复制完成的。
例如,如果您使用这种方式构建它可能会出错的地方。
>>> zeros = [0,0,0,0]
>>> s = [zeros,zeros,zeros,zeros]
>>> s[0][0]+=1
>>> s
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]
因此,复制列表时使用如下
>>> s = [list(zeros), list(zeros), list(zeros), list(zeros)]
>>> s[0][0]+=1
>>> s
[[1, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]