Ошибка при вложении «for» в итераторы [дубликат]Python

Программы на Python
Ответить
Anonymous
 Ошибка при вложении «for» в итераторы [дубликат]

Сообщение Anonymous »

Рассмотрите этот фрагмент Python:

Код: Выделить всё

range1 = range(3)
range2 = range(2)
print([(e1, e2) for e1 in range1 for e2 in range2])
Как и ожидалось, отображается 3x2 = 6 кортежей:

Код: Выделить всё

[(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]
Хорошо! Теперь давайте попробуем этот небольшой вариант:

Код: Выделить всё

iter1 = iter(range(3))
iter2 = iter(range(2))
print([(e1, e2) for e1 in iter1 for e2 in iter2])
Результат на удивление отличается:

Код: Выделить всё

[(0, 0), (0, 1)]
Этот результат выглядит неверным или, по крайней мере, противоречивым. Такое поведение наблюдается по крайней мере в Python 2.7, 3.12 и 3.14.

Примечания:
  • Существует множество вариантов выделения проблемы, включая определение итераторов с помощью генераторов (

    Код: Выделить всё

    yieldоператор 
    ). Настоящее описание представляет собой простейшую форму, которую я нашел, чтобы подчеркнуть неправильное поведение в моем коде.
  • Насколько я понимаю, основная проблема заключается в том, что внешний iter1 останавливается, как только останавливается внутренний iter2, что неожиданно.
  • Проблема не возникает, когда объекты итератора создаются «встроенными». Например, [(e1, e2) for e1 in iter(range(3)) for e2 in iter(range(2))] возвращает 6 ожидаемых кортежей.
Прежде чем открыть заявку на проблему с Python, я хотел бы получить отзыв об этом странном явлении, которое я считаю простой ошибкой.

Подробнее здесь: https://stackoverflow.com/questions/798 ... -iterators
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»