Почему for-loop с pop-method (или оператор del) не перебирает все элементы списка

Я новичок в Python и экспериментирую со списками, я использую Python 3.2.3 (по умолчанию, 19 октября 2012, 20:13:42), [GCC 4.6.3] на linux2

Вот мой примерный код

>>> l=[1,2,3,4,5,6] >>> for i in l: ... l.pop(0) ... print(l) ... 

Я бы ожидал следующего вывода

 1 [2, 3, 4, 5, 6] 2 [3, 4, 5, 6] 3 [4, 5, 6] 4 [5, 6] 5 [6] 6 [] 

Вместо этого я получаю это

 1 [2, 3, 4, 5, 6] 2 [3, 4, 5, 6] 3 [4, 5, 6] 

Цикл for останавливает итерацию после трех поворотов. Может кто-нибудь объяснить, почему?

3 Solutions collect form web for “Почему for-loop с pop-method (или оператор del) не перебирает все элементы списка”

Немного разворачивается (карет ( ^ ) находится в цикле «index»):

 your_list = [1,2,3,4,5,6] ^ 

после появления первого элемента:

 your_list = [2,3,4,5,6] ^ 

теперь продолжайте цикл:

 your_list = [2,3,4,5,6] ^ 

Теперь вытащите первый элемент:

 your_list = [3,4,5,6] ^ 

Теперь продолжайте цикл:

 your_list = [3,4,5,6] ^ 

Теперь вытащите первый элемент:

 your_list = [4,5,6] ^ 

Теперь продолжайте цикл – Подождите, мы закончили. 🙂


 >>> l = [1,2,3,4,5,6] >>> for x in l: ... l.pop(0) ... 1 2 3 >>> print l [4, 5, 6] 

Вы должны быть осторожны при попытке изменить коллекции, которые вы выполняете. В этом случае список отслеживает «текущую позицию» с помощью простого целочисленного индекса. Когда вы используете pop() , все меняет индекс, и поэтому элементы пропускаются.

На первой итерации цикла i есть l [0]. Затем вы выпадаете в список, затем вы получаете доступ к l [1], что было первоначально в l [2]. Затем вы выпадаете в список, а следующая итерация выполняет доступ к l [2], что было в l [4] и т. Д.

В любом случае нет необходимости вставлять элементы в этот код, возможно, вы делаете что-то более сложное в своем реальном коде.

Python не поддерживает изменение длины списка во время его перебора. Работайте над копией или используйте вместо нее понимание списка .

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

Python - лучший язык программирования в мире.