如何只增加Python列表列表第一行的第一个元素?

时间:2015-12-10 04:24:14

标签: python arrays list

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]]

好!感谢您的建议,问题在于我的构建。

3 个答案:

答案 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]]