Использование range
блокирует вас на указанное c количество итераций; range(len(m))
создает range
, используя значение len(m)
, теперь , и оно никогда не изменяется (это не может быть range
s неизменяемыми). Вы хотите такое поведение, точно так же, как вы хотите:
s = '123'
i = int(s)
s = 'abc'
оставить i
со значением 123
, а не умирать, когда аргумент int
задним числом становится 'abc'
(позволяя поведению range(len(m))
задним числом измениться, поскольку m
изменения будут морально эквивалентными и одинаково безумными).
Изменение list
при его повторении вызывает неодобрение, особенно если вы insert
делаете до конца list
или удаляете элементы. Это просто слишком подвержено ошибкам; в этом случае, когда j
принимает начальное значение i
и происходит insert
, вы вставили значение, которое циклы никогда не увидят (потому что оно будет смотреть на i + 1
далее) при вставке он в j > i
будет виден внешним l oop, но не внутренним (и в обоих случаях значение m[j]
будет обработано дважды в последовательных циклах).
Как правило, более безопасным решением является создание нового list
с нуля, добавление элементов из существующего list
по мере необходимости и добавление новых элементов в конец, как вы go. Это также намного быстрее insert
по центру list
равно O(n)
для каждый insert
(общая стоимость O(m * n)
, где m
- количество необходимых вставок, n
размер ввода), а append
амортизируется O(1)
(общая стоимость O(m + n)
).