). Настоящее описание представляет собой простейшую форму, которую я нашел, чтобы подчеркнуть неправильное поведение в моем коде.
Насколько я понимаю, основная проблема заключается в том, что внешний iter1 останавливается, как только останавливается внутренний iter2, что неожиданно.
Проблема не возникает, когда объекты итератора создаются «встроенными». Например, [(e1, e2) for e1 in iter(range(3)) for e2 in iter(range(2))] возвращает 6 ожидаемых кортежей.
Прежде чем открыть заявку на проблему с Python, я хотел бы получить отзыв об этом странном явлении, которое я считаю простой ошибкой.
Рассмотрите этот фрагмент Python: [code]range1 = range(3) range2 = range(2) print([(e1, e2) for e1 in range1 for e2 in range2]) [/code] Как и ожидалось, отображается 3x2 = 6 кортежей: [code][(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)] [/code] Хорошо! Теперь давайте попробуем этот небольшой вариант: [code]iter1 = iter(range(3)) iter2 = iter(range(2)) print([(e1, e2) for e1 in iter1 for e2 in iter2]) [/code] Результат на удивление отличается: [code][(0, 0), (0, 1)] [/code] Этот результат выглядит неверным или, по крайней мере, противоречивым. Такое поведение наблюдается по крайней мере в Python 2.7, 3.12 и 3.14.
Примечания: [list] [*]Существует множество вариантов выделения проблемы, включая определение итераторов с помощью генераторов ([code]yieldоператор [/code]). Настоящее описание представляет собой простейшую форму, которую я нашел, чтобы подчеркнуть неправильное поведение в моем коде. [*]Насколько я понимаю, основная проблема заключается в том, что внешний iter1 останавливается, как только останавливается внутренний iter2, что неожиданно. [*]Проблема не возникает, когда объекты итератора создаются «встроенными». Например, [(e1, e2) for e1 in iter(range(3)) for e2 in iter(range(2))] возвращает 6 ожидаемых кортежей. [/list] Прежде чем открыть заявку на проблему с Python, я хотел бы получить отзыв об этом странном явлении, которое я считаю простой ошибкой.