Das unerwartete Verhalten von Listenverständnissen: Rebound-Namen und der verschwommene Geltungsbereich
Pythons Listenverständnisse bieten eine prägnante und bequeme Möglichkeit, Listen zu erstellen, Aber sie bergen eine versteckte Gefahr: Namen neu zu verknüpfen, sogar über den Rahmen des eigentlichen Verständnisses hinaus. In Python 2 war dieses eigenartige Verhalten eine Quelle von Frustration und Programmierfehlern.
Bedenken Sie den folgenden Code:
x = "original value" squares = [x**2 for x in range(5)] print(x) # Prints 4 in Python 2!
In Python 2 wird bei der Ausführung dieses Codes unerwartet 4 statt ausgegeben „ursprünglicher Wert“. Dies liegt daran, dass das Listenverständnis die Schleifenkontrollvariable x in den umgebenden Bereich verliert und ihren ursprünglichen Wert überschreibt.
Dieses Verhalten ergibt sich aus der Art und Weise, wie Listenverständnisse in Python 2 implementiert wurden: als Optimierung zur Verbesserung ihrer Effizienz. Für Python-Programmierer war es jedoch ein erhebliches Problem, das zu Fehlern und Verwirrung führte.
Glücklicherweise wurde dieses „schmutzige kleine Geheimnis“ in Python 3 beseitigt. Listenverständnisse verwenden jetzt dieselbe Implementierungsstrategie wie Generatorausdrücke, die einen separaten Ausführungsrahmen verwenden. Folglich gibt das obige Codefragment in Python 3 den „Originalwert“ wie erwartet korrekt aus, da das x im Verständnis das x im umgebenden Bereich nicht überschattet.
Guido van Rossum, der Erfinder von Python, erklärte die Gründe für diese Änderung:
"[Wir haben diese Änderung vorgenommen, um] das 'schmutzige kleine Geheimnis' des Listenverständnisses zu lüften, indem wir dieselbe Implementierungsstrategie wie für verwenden Generatorausdrücke.“
Dieses verbesserte Verhalten in Python 3 ist ein Beweis für die ständige Weiterentwicklung und Verfeinerung der Python-Sprache und sorgt für mehr Klarheit und Vorhersehbarkeit bei der Verwendung des Listenverständnisses.
Das obige ist der detaillierte Inhalt vonWarum bindet das Listenverständnis von Python 2 Namen außerhalb seines Geltungsbereichs neu?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!