Python 为什么删除for循环中的列表项不能正常工作?
为什么不从列表中删除每个Python 为什么删除for循环中的列表项不能正常工作?,python,list,Python,List,为什么不从列表中删除每个0 list = [0,0,5,3,0,8,0,4] for num in list: if num == 0: list.remove(0) print(list) 因为你在循环列表的时候改变了列表,这几乎总是一个坏主意。下面是所发生情况的演示: list = [0,0,5,3,0,8,0,4] for num in list: print(num, list) if num == 0: list.re
0
list = [0,0,5,3,0,8,0,4]
for num in list:
if num == 0:
list.remove(0)
print(list)
因为你在循环列表的时候改变了列表,这几乎总是一个坏主意。下面是所发生情况的演示:
list = [0,0,5,3,0,8,0,4]
for num in list:
print(num, list)
if num == 0:
list.remove(0)
print(list)
输出
0[0,0,5,3,0,8,0,4]
5 [0, 5, 3, 0, 8, 0, 4]
3 [0, 5, 3, 0, 8, 0, 4]
0 [0, 5, 3, 0, 8, 0, 4]
0 [5, 3, 0, 8, 0, 4]
[5, 3, 8, 0, 4]
这是文档中的一个相关部分,它告诉我们这是个坏主意:
注意:当序列被
循环(这仅适用于可变序列,例如列表)。一
内部计数器用于跟踪下一个使用的项目,以及
这在每次迭代中递增。当这个计数器到达
循环终止的序列长度。这意味着如果
套件从序列中删除当前(或上一个)项
将跳过下一项(因为它获取当前项的索引)
这已经得到了治疗)。同样,如果套件插入
在当前项之前的序列中,当前项将
下次通过循环再次处理。这会导致严重的后果
可以通过使用一个片段创建临时副本来避免的bug
整个序列,例如
for x in a[:]:
if x < 0: a.remove(x)
输出:
[5,3,8,4]
实际上,这是因为您在迭代时更改了
列表的大小。这绝不是一个好主意。对列表
关键字添加阴影也不是一个好主意。这能回答你的问题吗?因此,要么使用列表理解,要么使用列表副本。问题的标题与此无关。您与问题中的索引无关
list_ = [0,0,5,3,0,8,0,4] # list shadows the built-in name, don't use it
list_ = [num for num in list_ if num != 0]
print(list_)