如何仅递增Python列表第一行的第一个元素?

2024-04-25 06:10:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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

好的!谢谢你的建议,问题出在我的s


Tags: in命令元素列表整数out建议
3条回答

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

这是典型的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]]

你一开始就“错误地”列出了你的列表;列表中的每个元素只是指向同一个列表。当你更新列表时,它们都会更新。你知道吗

使用如下代码创建列表:

s = [[0 for _ in range(5)] for _ in range(5)]

相关问题 更多 >