Итераторы списка (другие итераторы могут вести себя по-разному) работают, запоминая, к какому индексу они относятся в данный момент, и при следующем вызове проверяют, находится ли индекс в диапазоне, и если да, получают элемент, а затем обновляют индекс , Ваш код достигает индекса 2, удаляет 'c'
, затем переходит к индексу 3, который теперь является записью 'e'
и продолжается, пропуская запись 'd'
полностью. Если вы добавите оператор print в цикл for, вы увидите поведение.
Вы можете взглянуть на исходный код C для объектов списка по адресу:
https://github.com/python/cpython/blob/master/Objects/listobject.c
Найдите «listiter_next», чтобы увидеть реализацию.
Проверяет, меньше ли текущий индекс длины списка:
if (it->it_index < PyList_GET_SIZE(seq))
и, если это так, получает элемент и увеличивает индекс:
item = PyList_GET_ITEM(seq, it->it_index);
++it->it_index;