Fehler beim Verschachteln von „for“ auf Iteratoren [Duplikat]Python

Python-Programme
Anonymous
 Fehler beim Verschachteln von „for“ auf Iteratoren [Duplikat]

Post by Anonymous »

Bedenken Sie dieses Python-Snippet:

Code: Select all

range1 = range(3)
range2 = range(2)
print([(e1, e2) for e1 in range1 for e2 in range2])
Dies zeigt wie erwartet 3x2 = 6 Tupel an:

Code: Select all

[(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]
Gut! Versuchen wir es nun mit dieser leichten Variante:

Code: Select all

iter1 = iter(range(3))
iter2 = iter(range(2))
print([(e1, e2) for e1 in iter1 for e2 in iter2])
Die Ausgabe ist überraschend anders:

Code: Select all

[(0, 0), (0, 1)]
Dieses Ergebnis sieht falsch oder zumindest inkonsistent aus. Dieses Verhalten tritt zumindest bei Python 2.7, 3.12 und 3.14 auf.

Hinweise:
  • Es gibt viele Varianten, um das Problem hervorzuheben, einschließlich der Definition von Iteratoren durch Generatoren (

    Code: Select all

    yield
    -Anweisung). Die vorliegende Beschreibung ist nur die einfachste Form, die ich gefunden habe, um das Fehlverhalten in meinem Code hervorzuheben.
  • Nach meinem Verständnis besteht das Grundproblem darin, dass der äußere Iter1 stoppt, sobald der innere Iter2 stoppt, was unerwartet ist.
  • Das Problem tritt nicht auf, wenn die Iteratorobjekte „inline“ instanziiert werden. Beispielsweise gibt [(e1, e2) für e1 in iter(range(3)) für e2 in iter(range(2))] die 6 erwarteten Tupel zurück.
Bevor ich ein Python-Problemticket öffne, hätte ich gerne etwas Feedback zu diesem seltsamen Phänomen, das ich als einfachen Fehler betrachte.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post