Das alte Verhalten war ein Fehler, konnte aber nicht einfach behoben werden, da sich einige Codes darauf stützten.
Die Variable i
innerhalb der Liste Verständnis sollte eine andere i
von dem einen auf der obersten Ebene sein. Logischerweise sollte es einen eigenen Umfang haben, der nicht außerhalb des Verständnisses liegt, da sein Wert nur innerhalb des Verständnisses Sinn ergibt. Aber in Python 2.x war der Bereich aufgrund eines Implementierungsdetails größer als notwendig, was dazu führte, dass die Variable in den äußeren Bereich "leckte", was zu verwirrenden Ergebnissen führte.
Python 3.0 war absichtlich nicht dazu gedacht, rückwärtskompatibel zu früheren Versionen zu sein, daher nutzten sie die Gelegenheit, dieses unerwünschte Verhalten zu beheben.
In Python 2.3 und späteren Releases "leckt" ein Listenverständnis die Steuervariablen von jedem, die es enthält, in den enthaltenden Bereich. Allerdings ist dieses Verhalten als veraltet, und es verlassen wird in Python 3,0
Source
Wow. Ich habe Glück, dass ich es hier gefunden habe, ich würde wochenlang nach dem Käfer suchen, wenn ich in meinem eigenen Code darauf stoße. +1 für Frage, -1 für Python :( – Kos
Ähnliche Fragen hier: http://stackoverflow.com/questions/4198906/python-list-comprehension-rebind-names-even-after-scope-of-comprehension-is- –