Указанный результат верен: [2, 5, 11, 111, 7, 27]. Изменение длины списка во время for сдвигает элементы под продвигающимся итератором, поэтому 2 не проверяется после удаления 1.
Поведение удаления элементов из списка во время его обхода
Указанный результат верен: [2, 5, 11, 111, 7, 27]. Изменение длины списка во время for сдвигает элементы под продвигающимся итератором, поэтому 2 не проверяется после удаления 1.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Опишите, как работает приведённый код, который пытается удалить из списка все значения меньше 5, одновременно проходя по этому же списку.
numbers = [1, 2, 5, 11, 3, 111, 7, 27]
for i in numbers:
if i < 5:
numbers.remove(i)
print(numbers)
# Результат: [2, 5, 11, 111, 7, 27]
Ответ
Указанный результат верен: [2, 5, 11, 111, 7, 27]. Изменение длины списка во время for сдвигает элементы под продвигающимся итератором, поэтому 2 не проверяется после удаления 1.
Цикл удалит 1 и 3, но не все значения меньше 5. Это не случайная ошибка remove(), а следствие совместного изменения контейнера и его обхода. Для получения очищенной последовательности подходит списковое включение с условием >= 5. Другой вариант — удаление по индексам справа налево, чтобы сдвиги не затрагивали ещё не обработанную часть. Обычный проход по копии тоже возможен, но многократный remove может быть квадратичным.