Позвольте мне показать вам, что происходит в коде:
# Initial position
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
#^
# i
# Remove first
[1, 2, 3, 4, 5, 6, 7, 8, 9]
#^
# i
# Move next
[1, 2, 3, 4, 5, 6, 7, 8, 9]
# ^
# i
# Remove first
[2, 3, 4, 5, 6, 7, 8, 9]
# ^
# i
# Move next
[2, 3, 4, 5, 6, 7, 8, 9]
# ^
# i
# And so on...
[4, 5, 6, 7, 8, 9]
# ^
# i
# Remove first
[5, 6, 7, 8, 9]
# ^
# i
# Move next
# Oops, the end of the list
# The result:
[5, 6, 7, 8, 9]
Давайте посмотрим, как это работает под капотом. Во-первых, нам нужно итератора:
# for i in arr:
In [30]: it = iter(arr)
In [31]: it
Out[31]: <listiterator at 0x130f9d0>
И мы будем называть next(it)
, пока она не поднимается StopIteration
исключение. Итак, давайте сделаем это:
In [32]: i = next(it)
In [33]: i
Out[33]: 0
Вау, мы получили первый элемент из списка! Давайте посмотрим, что произойдет, если мы попробуем поп-элемент с нулевым индексом:
# if i in arr:
# print i
# arr.pop(0)
In [34]: i in arr
Out[34]: True
In [35]: print i
0
In [36]: arr.pop(0)
Out[36]: 0
In [37]: arr
Out[37]: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Хорошо, элемент выскочил. Переход к следующей итерации цикла:
In [38]: i = next(it)
In [39]: i
Out[39]: 2
Хм ... Похоже, у нас есть второй элемент. Давайте снова выберем первый!
In [40]: i in arr
Out[40]: True
In [41]: print i
2
In [42]: arr.pop(0)
Out[42]: 1
In [43]: arr
Out[43]: [2, 3, 4, 5, 6, 7, 8, 9]
Давайте посмотрим на третьей итерации:
In [44]: i = next(it)
In [45]: i
Out[45]: 4
Я думаю, теперь ясно, что цикл будет иметь 5 итераций. На каждой итерации вы удаляете первый элемент. И из-за этого вы будете пропускать нечетные элементы во время итерации.