Развёрнутое пояснение
🔘Список 𝚗𝚞𝚖𝚜 = [𝟸, 𝟺, 𝟼, 𝟾]. Цикл использует внутренний индекс, который увеличивается на каждой итерации.
0️⃣Шаг 𝟶: индекс 𝟶, элемент 𝟸, условие истинно, вызывается 𝚗𝚞𝚖𝚜.𝚛𝚎𝚖𝚘𝚟𝚎(𝟸). Список становится [𝟺, 𝟼, 𝟾], но индекс уже переходит к 𝟷.
1️⃣Шаг 𝟷: индекс 𝟷, в списке [𝟺, 𝟼, 𝟾] это элемент 𝟼 (а не 𝟺!), условие истинно, удаляем 𝟼. Список становится [𝟺, 𝟾], индекс переходит к 𝟸.
2️⃣Шаг 𝟸: индекс 𝟸 выходит за пределы списка длины 𝟸, цикл завершается.
3️⃣Элементы 𝟺 и 𝟾 никогда не были проверены, потому что итератор их «перепрыгнул». Результат: [𝟺, 𝟾].
Почему это важно
Задача наглядно показывает, почему нельзя удалять элементы из списка во время итерации по нему: даже если кажется, что «всё должно удалиться», половина элементов останется. Безопасные альтернативы: итерация по копии 𝚏𝚘𝚛 𝚡 𝚒𝚗 𝚗𝚞𝚖𝚜[:], list comprehension [𝚡 𝚏𝚘𝚛 𝚡 𝚒𝚗 𝚗𝚞𝚖𝚜 𝚒𝚏 𝚡 % 𝟸 != 𝟶], или проход в обратном порядке.
Post #4569
754
- ❤ 3
- ✍ 2