Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么删除for循环中的列表项不能正常工作?_Python_List - Fatal编程技术网

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_)