>>49296[:] — это слайс. [n:m] берёт кусок списка с индексами от n до m-1 и возвращает их в новом списке. [:] — это слайс от начала и до конца, то есть новая копия старого списка.
Оба твоих кусочка кода отличаются только списком в in. Обходится либо копия списка l, либо сам список l.
По сути, цикл, проходя по списку, убивает все элементы и добавляет в него частное от деления чётных чисел на 2, то есть из элементов 2, 4, 6 делает [1, 2, 3].
В первом случае цикл проходит по копии списка, пережёвывая все элементы из копии один за другим, после чего останавливается. l[:] не меняется.
Вот тут мои раздумья по поводу второго случая, которые оказались неверными:
Во втором случае цикл, пройдя первоначальные [1,2,3,4,5,6], обнаружит, что в списке есть ещё и [1,2,3]. И пойдёт работать дальше.Если было бы так, то отдало бы целое ничего — двойка дала бы 1 и цикл бы прервался.Но есть одно «но».
Во второй части ветка условия else никогда не наступает. CPython обрабатывает прохождение for-цикла по массиву так, как любой программист сделал бы это, например, в Си. Через индекс. Запоминает индекс и присваивает переменной i значение l[индекс] на каждой итерации.
Поэтому, на первой итерации CPython достаёт нулевой элемент, его же убирает из l, l становится равно [2,3,4,5,6].
На второй итерации CPython помнит, что индекс текущего элемента в l был равен нулю. И берёт первый элемент l. То есть, 3, единицу же убрали. Потом таким же образом обработает 5, четвёрка же сдвинулась к началу. И завершится.
Я тебе рекомендую не менять таким образом списки. Откуда Python знать, что ты со списком делаешь?
Хм, а питоньи списки подозрительно напоминают массивы. Будь там настоящий список, то всё это либо повалилось бы с диким грохотом, либо отдало пустоту. Немного склоняюсь ко второму варианту. Надо будет попробовать написать код с настоящими списками, пусть и не на питоне.Лучше либо строить новый список в цикле, либо делать всё в while, заменяя элемент.
А ещё можно сделать вот это:
print filter(None, map(lambda i: None if (i % 2) else (i // 2), range(1, 7)))
или, поменяв местами filter и map:
map(lambda i: i // 2, filter(lambda i: not(i % 2), range(1, 7)))
Короче на один знакmap(lambda i: i // 2, filter(lambda i: i % 2 - 1, range(1, 7)))И да, встретил проблему — трассируй руками, логи, принты делай внутри, дебаггер и REPL используй. Поможет.
В чём пишешь?