Sind Listenverständnisse syntaktischer Zucker für `Liste (Generatorausdruck)` in Python 3?

In Python 3 ist ein Listenverständnis einfach syntaktischer Zucker für einen Generatorausdruck, der in das @ eingegeben wirlist Funktion?

z.B. ist der folgende Code:

squares = [x**2 for x in range(1000)]

im Hintergrund tatsächlich in folgendes konvertiert?

squares = list(x**2 for x in range(1000))

Ich weiß, dass die Ausgabe identisch ist, und Python 3 behebt die überraschenden Nebenwirkungen der umgebenden Namespaces, die Verständnis hatten, aber in Bezug auf das, was der CPython-Interpreter unter der Haube tut, ist der erstere auf den letzteren konvertiert oder gibt es welche Unterschied, wie der Code ausgeführt wird?

Hintergrun

Ich habe diesen Anspruch auf Äquivalenz in den Kommentaren zu @ gefundediese Frag und eine schnelle Google-Suche zeigten, dass derselbe Anspruch erhoben wurdeHie.

There wurde auch einige Erwähnung in der Was ist neu in Python 3.0 docs, aber der Wortlaut ist etwas vage:

Beachten Sie auch, dass Listenverständnisse eine andere Semantik haben: Sie kommen dem syntaktischen Zucker eines Generatorausdrucks in einem list () -Konstruktor näher, und insbesondere werden die Variablen für die Schleifensteuerung nicht mehr in den umgebenden Bereich übertragen.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage