2015-11-02 2 views
0

Я использую python 2.7. Я пытаюсь имитировать выскакивание элемента из списка, используя функцию pop. Но я получаю непоследовательный результат.Почему я получаю разные выходные данные из функции pop() в python

код с использованием списка переменного

list_pop = [1,2,3] 
for x in list_pop: 
    print list_pop 
    y = list_pop.pop(0) 
    print y 

Результат:

[1, 2, 3] 
1 
[2, 3] 
2 

код без использования переменного для хранения списка

list_pop = [1,2,3] 
for x in [1,2,3]: 
    print list_pop 
    y = list_pop.pop(0) 
    print y 

[1, 2, 3] 
1 
[2, 3] 
2 
[3] 
3 
  • Я Пытался выскакиваю индекс 0 из список с одним элементом, который он работает. Мне интересно, почему мой первый код останавливает печать после номера 2, но когда я печатаю list_pop, он дает [3], первый код все равно должен перебирать его и печатать 3. Я ожидаю одинаковых результатов для обоих кодов. Что мне здесь не хватает?
+1

Ваш первый бит кода не должен запускаться. Скопируйте и вставьте ** точно ** код, который вы используете для каждого экземпляра. Кроме того, ваш второй бит кода не имеет смысла, поскольку 'list_pop' не определен. – MattDMo

ответ

3

В первом случае вы выполняете итерирование по списку при его изменении, что почти наверняка даст неожиданные результаты.

Во втором случае вы не итерируете по тому же списку, который вы меняете, поэтому результат представляет собой фиксированное количество итераций.

Если вы хотите сделать первый и изучить все элементы, цикл while может работать лучше.

while not len(list_pop) == 0: 
    print list_pop 
    y = list_pop.pop(0) 
    print y 

Другой альтернативой является, чтобы сделать копию списка и перебрать копию:

for x in list_pop[:]: 
    print list_pop 
    y = list_pop.pop(0) 
    print y 
+0

Я думаю, что вариант while - это, вероятно, лучшее эмпирическое правило. Если вы изменяете более одного элемента в списке за цикл, повторение по копии может также привести к странному поведению. «while» всегда будет иметь желаемый результат: вы останавливаетесь, когда список ушел. – suBDavis

2

хорошее общее правило следовать, что вы не должны изменять список, который вы итерация , Это именно то поведение, которое вы должны получить: список, который вы повторяете, становится все меньше и меньше, поэтому цикл будет иметь меньше и меньше элементов для повторения. Он не выполняет итерацию по исходному списку, итерации по текущему списку.

Во втором примере вы перебираете список, который никогда не изменяется, поэтому вы получаете ровно три итерации.

Вы можете взглянуть на этот вопрос: Remove items from a list while iterating

2

Вы не должны изменять свой список в то время как цикл через него. Вот почему результаты непоследовательны. Вместо этого вы можете использовать цикл while и проверить список пустым:

while list_pop: 
    print list_pop 
    y = list_pop.pop(0) 
    print y 
+0

Я не знал, что вы можете получить bool из списка. Бог, я люблю питона. – suBDavis

+0

Вы также можете сделать это для пустых строк, dicts, None и т. Д. Это специальный метод для обеспечения логического преобразования в ваши собственные классы. Да, питон - отличный язык :) –

Смежные вопросы