Перечисление Python и вывод циклов for

#python #for-loop #enumerate

#python #for-цикл #перечислять

Вопрос:

У меня есть 2 вопроса относительно следующего кода:

  1. Почему я теряю (0, 1) из enum_l1 и (0, 3) из enum_l2 после циклов for?
  2. Если я не помещу первые 2 отпечатка в качестве комментариев, я не увижу последние 2 отпечатка (короче говоря, программа будет отображать только «enum_l1 до:» и «enum_l2 до:» без «enum_l1 после:» и «enum_l2 после:»). Верно и обратное. Почему? Почему мне нужно добавить, чтобы увидеть все 4 отпечатка в этом коде?
 list1 = [1,2,3]
list2 = [3,1,2]

enum_l1 = enumerate(list1)
#print("enum_l1 before: ", list(enum_l1))
enum_l2 = enumerate(list2)
#print("enum_l2 before: ", list(enum_l2))

for count1, value1 in enum_l1:
    for count2, value2 in enum_l2:
        print("enum_l1 after: ", list(enum_l1))
        print("enum_l2 after: ", list(enum_l2))
 

Вывод:

 enum_l1 before:  [(0, 1), (1, 2), (2, 3)]
enum_l2 before:  [(0, 3), (1, 1), (2, 2)]

enum_l1 after:  [(1, 2), (2, 3)]
enum_l2 after:  [(1, 1), (2, 2)]
 

Спасибо.

Комментарии:

1. Я не думаю, что вы что-то «теряете», то, что вы печатаете, — это оставшиеся значения в выражении enumerate. Попробуйте печатать count1, value1 и count2, value2 каждый раз вокруг их циклов for

2. Потому enumerate что объекты являются итераторами .

Ответ №1:

enum_l1 является итератором. Внутри цикла вы извлекаете первый элемент, который есть (0,1) , а затем вместо печати count1, value1 вы печатаете состояние итератора enum_l1 , который пропускает первый экземпляр.

Поведение, которое вы видите внутри цикла, эквивалентно:

 enum_l1 = enumerate(list1)
print(next(enum_l1))
print(list(enum_l1))
 

Ответ №2:

enumeration Создает объект итератора. Когда вы инициализируете список с его помощью (выполняется внутри инструкции print), он использует итератор. После этого из него больше не возвращаются значения.