循环列表时出现意外行为

Fez*_*ter 0 python for-loop list modulo

我有一个四个数字的列表:

mylist=[3,5,67,4]
Run Code Online (Sandbox Code Playgroud)

我想删除所有奇数.所以,我写了以下内容:

for item in mylist:
  if item%2==1:
    mylist.remove(item)
Run Code Online (Sandbox Code Playgroud)

当我打印时mylist,我得到以下内容:

[5,4]
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚为什么会这样.但是,当我在声明后添加一个print语句时,if我得到了正确的答案:

for item in mylist:
  if item%2==1:
    mylist.remove(item)
  print mylist
Run Code Online (Sandbox Code Playgroud)

产量:

[4]
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?我错过了什么?

Gar*_*tty 5

在迭代它时就地修改列表是个坏主意.当您迭代它时列表会发生变化,您的迭代会继续进行,就好像列表没有改变一样 - 产生奇怪的结果.

最好的解决方案是构建一个新列表 - 最好使用列表理解:

mylist = [item for item in mylist if item % 2 == 0]
Run Code Online (Sandbox Code Playgroud)

如果必须修改列表,可以在之后(mylist[:] = ...)返回值,但不一定需要就地修改它.

这也具有可读性和简洁性的优点.