Будет напечатано [2, 5, 11, 111, 7, 27]. Удаление сдвигает элементы, из-за чего число 2 пропускается итератором.
Какой результат выведет программа при удалении элементов списка во время его обхода?
Будет напечатано [2, 5, 11, 111, 7, 27]. Удаление сдвигает элементы, из-за чего число 2 пропускается итератором.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Какой вывод появится в консоли после выполнения следующего кода? Пример демонстрирует удаление элементов из списка во время его перебора.
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 пропускается итератором.
После удаления 1 число 2 сдвигается на индекс 0, но цикл уже переходит к следующему индексу и получает 5. Позже удаляется 3. Итератор не начинает обход заново после изменения списка.
Для удаления всех чисел меньше 5 безопаснее:
numbers[:] = [value for value in numbers if value >= 5]
Результат — [5, 11, 111, 7, 27]. Присваивание срезу сохраняет идентичность списка. Обычное numbers = [...] также отфильтрует значения, но создаст новый объект, что важно при наличии других ссылок. Линейная фильтрация эффективнее многократных поисков и удалений.