# Strange result when removing item from a list while iterating over it

You’re modifying the list while you iterate over it. That means that the first time through the loop, `i == 1`, so 1 is removed from the list. Then the `for` loop goes to the second item in the list, which is not 2, but 3! Then that’s removed from the list, and then the `for` loop goes on to the third item in the list, which is now 5. And so on. Perhaps it’s easier to visualize like so, with a ^ pointing to the value of `i`:

``````[1, 2, 3, 4, 5, 6...]
^
``````

That’s the state of the list initially; then 1 is removed and the loop goes to the second item in the list:

``````[2, 3, 4, 5, 6...]
^
[2, 4, 5, 6...]
^
``````

And so on.

There’s no good way to alter a list’s length while iterating over it. The best you can do is something like this:

``````numbers = [n for n in numbers if n >= 20]
``````

or this, for in-place alteration (the thing in parens is a generator expression, which is implicitly converted into a tuple before slice-assignment):

``````numbers[:] = (n for in in numbers if n >= 20)
``````

If you want to perform an operation on n before removing it, one trick you could try is this:

``````for i, n in enumerate(numbers):
if n < 20 :
print("do something")
numbers[i] = None
numbers = [n for n in numbers if n is not None]
``````