Итератор list
в CPython работает путем итерации по позициям списка.Вы можете думать, что это работает так:
def list_iter(items: list):
index = 0
while True:
yield items[index]
index += 1
Другими словами, итерация предоставляет элемент в 0, затем 1, затем 2 и так далее.Предварительная выборка элементов не производится - при необходимости элемент ищется из списка.
При удалении первого элемента на каждом шаге список сокращается на 1 на каждом шаге.Поскольку вы начинаете со списка из 6 элементов, на третьей итерации он сокращается до 3 элементов - это означает, что четвертая итерация не может найти элемент.Таким образом, ваша итерация заканчивается после трех шагов.
Это можно увидеть при печати также текущего элемента в каждом цикле.Чтобы визуализировать эффект, используйте enumerate
, чтобы получить индекс итерации.Обратите внимание, что он увеличивается на один индекс, но значения также сдвигаются для общего смещения двух:
>>> a = [1, 2, 3, 4, 5, 6]
... for idx, elem in enumerate(a):
... print(elem, 'from', a)
... print(' ', ' '*idx, '^')
... del a[0]
...
1 from [1, 2, 3, 4, 5, 6]
^
3 from [2, 3, 4, 5, 6]
^
5 from [3, 4, 5, 6]
^
Как правило, нет четкого определения для изменения контейнера во время итерации по нему.Вместо этого вы должны перебрать копию:
a = [1, 2, 3, 4, 5, 6]
for elem in a.copy():
del a[0]
print(a)