修改整个列表的最佳方法是使用它的副本:
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> l=range(10)
>>> type(l)
>>> l[:]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> type(l[:])
>>>从关闭文档:
If you need to modify the sequence you are iterating over while inside
the loop (for example to duplicate selected items), it is recommended
that you first make a copy. Iterating over a sequence does not
implicitly make a copy. The slice notation makes this especially
convenient:
>>>>>> for w in words[:]: # Loop over a slice copy of the entire list.
... if len(w) > 6:
... words.insert(0, w)
...
>>> words
['defenestrate', 'cat', 'window', 'defenestrate']http://docs.python.org/2/tutorial/controlflow.html
特别是你的例子:
def remove_odd(l):
for i in l[:]:
if i % 2:
l.remove(i)
return l工作得很好。