python - 更改列表中倒数第二个条目会更改所有前面的条目
问题描述
我正在尝试编写的代码包括以相反顺序填充列表的 for 循环:首先设置最后一个条目,然后根据第 (t+1) 个条目设置第 t 个条目,向后迭代直到它到达第 0 个条目。不幸的是,在倒数第二个等于倒数第二个之前,我一直遇到所有条目的奇怪问题。
奇怪的是,即使没有 for 循环,我也设法重现了这个问题。
此示例中的条目是长度为 3 的列表,因为在我的实际工作中就是这样。如果我只是将条目设为整数,问题就会消失。
def bet(p):
bet=[[0,0,0]]*p
bet_end=[]
for k in range(0,3):
bet_end.append(1)
bet[p-1]=bet_end
for k in range(0,3):
bet[p-2][k]=2
return bet
test=bet(5)
我希望输出是
[[0,0,0],[0,0,0],[0,0,0],[2,2,2],[1,1,1]]
相反,我得到
[[2,2,2],[2,2,2],[2,2,2],[2,2,2],[1,1,1]]
为什么第 0 条、第 1 条和第 2 条条目会受到第 3 条条目更改的影响?
解决方案
更改此行
bet=[[0,0,0]]*p
至,
bet=[[0,0,0] for i in range(p)]
输出:
>>> bet(5)
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [2, 2, 2], [1, 1, 1]]
为什么?
阅读此处了解如何正确初始化列表。
推荐阅读
- c - C中的非函数do while循环
- python-3.x - Lambda 函数在 Python 3.x 中返回错误值
- r - 如何使用 R 中的 dplyr 只保留那些一起包含最长连续运行的变量加一的行?
- flutter - 在颤动中传递选定索引的更好方法
- controller - G-code G1 移动指令与 MM114 获取电机位置指令不一致
- asp.net - 如何通过 VB.Net 中的 Drive API 将文件上传到 Google 共享驱动器?
- c# - 对从 ICollection 对象创建的 List<> 执行操作 - ICollection 对象正在更改
- javascript - 拖动链接的图像(不触发链接)
- c# - 在静态类定义中得到 SA1401
- excel - 返回最大日期的行号