Удаление элементов списка во время прохода по нему

Результат — [2, 5, 11, 111, 7, 27]. После удаления элемента список сдвигается, но индекс итератора продолжает расти, поэтому некоторые элементы пропускаются; число 2 останется.

Короткий ответ

Что ответить на собеседовании

Результат — [2, 5, 11, 111, 7, 27]. После удаления элемента список сдвигается, но индекс итератора продолжает расти, поэтому некоторые элементы пропускаются; число 2 останется.

Подробный разбор

Ответ с пояснениями

Условие

Проанализируйте, что происходит в приведённом фрагменте кода, когда из списка удаляют элементы во время его итерации с помощью цикла for.

nums = [1, 2, 5, 11, 3, 111, 7, 27]

for val in nums:
    if val < 5:
        nums.remove(val)

print(nums)

Ответ

Результат — [2, 5, 11, 111, 7, 27]. После удаления элемента список сдвигается, но индекс итератора продолжает расти, поэтому некоторые элементы пропускаются; число 2 останется.

Сначала удаляется 1, и 2 переезжает на индекс 0, который итератор уже прошёл. Позже удаляется 3, после чего пропускается 111, но он и так не подлежит удалению. Безопаснее фильтровать отдельно:

nums = [value for value in nums if value >= 5]

Если нужно сохранить тот же объект списка для других ссылок, используйте nums[:] = [value for value in nums if value >= 5].

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее