#python #for-loop #enumerate
#python #for-цикл #перечислять
Вопрос:
У меня есть 2 вопроса относительно следующего кода:
- Почему я теряю (0, 1) из enum_l1 и (0, 3) из enum_l2 после циклов for?
- Если я не помещу первые 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), он использует итератор. После этого из него больше не возвращаются значения.