Steven D'Aprano <steve+pyt...@pearwood.info> added the comment:

In addition to Xiang Zhang's comments, this is neither a feature nor a bug, but 
a misunderstanding. This has nothing to do with strings or underscores:

py> L = [1, 2, 3, 4, 5]
py> for item in L:
...     L.remove(item)
...
py> L
[2, 4]


When you modify a list as you iterate over it, the results can be unexpected. 
Don't do it.

If you *must* modify a list that you are iterating over, you must do so 
backwards, so that you are only removing items from the end, not the beginning 
of the list:

py> L = [1, 2, 3, 4, 5]
py> for i in range(len(L)-1, -1, -1):
...     L.remove(L[i])
...
py> L
[]


But don't do that: it is nearly always must faster to make a copy of the list 
containing only the items you wish to keep, then assign back to the list using 
slicing. A list comprehension makes this an easy one-liner:

py> L = [1, 2, 3, 4, 5]
py> L[:] = [x for x in L if x > 4]
py> L
[5]

----------
nosy: +steven.daprano

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue33157>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to