Вывод: [2, 5, 11, 111, 7, 27]. После удаления 1 следующий элемент 2 сдвигается назад и пропускается итератором.
Поведение кода при удалении элементов списка во время обхода
Вывод: [2, 5, 11, 111, 7, 27]. После удаления 1 следующий элемент 2 сдвигается назад и пропускается итератором.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Опишите, что происходит в данном фрагменте кода, предскажите его вывод и объясните, какую задачу хотел решить автор. Пример: удаление элементов из списка в процессе итерации.
values = [1, 2, 5, 11, 3, 111, 7, 27]
for x in values:
if x < 5:
values.remove(x)
print(values)
Ответ
Вывод: [2, 5, 11, 111, 7, 27]. После удаления 1 следующий элемент 2 сдвигается назад и пропускается итератором.
Итератор списка продвигает индекс, но удаление текущего элемента сдвигает оставшиеся элементы влево. После удаления 1 число 2 оказывается на уже пройденной позиции. Позже удаляется 3, а 111 также пропускается, хотя это не влияет на требуемую фильтрацию.
Безопасный вариант:
values = [x for x in values if x >= 5]
Если необходимо сохранить идентичность списка для других ссылок:
values[:] = [x for x in values if x >= 5]
Оба варианта дают [5, 11, 111, 7, 27]. Фильтрация выполняется за O(n), тогда как многократный remove может привести к O(n²).