List Comprehensions und Name Rebinding
List Comprehensions sind eine prägnante Syntax zum Erstellen von Listen in Python. Sie zeigen jedoch unerwartetes Verhalten im Zusammenspiel mit dem Scoping.
Betrachten Sie den folgenden Code:
x = "original value" squares = [x**2 for x in range(5)] print(x) # Prints 4 in Python 2!
In diesem Beispiel bindet das Listenverständnis die Variable x erneut an den aktuellen Wert aus der Iteration von Bereich(5). Dieses Verhalten wird als Neubindung von Namen bezeichnet.
Grund für die Neubindung von Namen
In Python 2 wurden Listenverständnisse anders als Generatorausdrücke implementiert. Das Listenverständnis wurde auf Geschwindigkeit optimiert, indem die Schleifenkontrollvariable in den umgebenden Bereich übertragen wurde. Generatorausdrücke hingegen verwendeten einen separaten Ausführungsrahmen, um diesen Verlust zu verhindern.
Änderung in Python 3
In Python 3 wurde diese Unterscheidung entfernt. Listenverständnisse verwenden jetzt dieselbe Implementierung wie Generatorausdrücke. Infolgedessen kommt es in Python 3 nicht mehr zu einer Namensneubindung.
Folgen
Die Namensneubindung kann zu unerwartetem Verhalten und Fehlern führen, insbesondere in Fällen, in denen derselbe Variablenname verwendet wird wird sowohl im Listenverständnis als auch im umgebenden Bereich verwendet. Wie in der Frage erwähnt, kann dies durch die Verwendung von Unterstrichpräfixen für temporäre Variablen in Listenverständnissen abgemildert werden.
Guido van Rossum, der Erfinder von Python, erklärte die Geschichte hinter dieser Änderung: In Python 2 sind Listenverständnisse durchgesickert die Schleifenkontrollvariable als Artefakt der anfänglichen Implementierung, um die Leistung zu optimieren. In Python 3 galt dies jedoch als schmutziges kleines Geheimnis, das durch die Übernahme derselben Implementierungsstrategie wie bei Generatorausdrücken behoben werden sollte.
Das obige ist der detaillierte Inhalt vonWarum bindet das Listenverständnis von Python 2 Variablen neu und wie hat Python 3 dies geändert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!