Python créateur, Guido van Rossum, mentionne lorsqu'il écrit à propos de générateur d'expressions qui ont tous été construits en Python 3: (c'est moi qui souligne)
Nous avons également fait un autre changement en Python 3, afin d'améliorer l'équivalence entre les interprétations de la liste et le générateur d'expressions. En Python 2, la compréhension de liste de "fuite" de la variable de contrôle de boucle dans les environs du champ d'application:
x = 'before'
a = [x for x in 1, 2, 3]
print x # this prints '3', not 'before'
C'était un artefact de l'origine de la mise en œuvre des interprétations de la liste; il a été l'un de Python "dirty little secrets" pendant des années. Il a commencé comme un acte intentionnel de compromis à faire des interprétations de la liste aveuglément rapides, et tandis qu'il n'était pas un piège classique pour les débutants, c'est très certainement piqué gens de temps en temps. Pour le générateur d'expressions que nous ne pouvions pas faire cela. Générateur d'expressions sont mises en œuvre à l'aide de générateurs, dont l'exécution exige une exécution séparée cadre. Ainsi, le générateur d'expressions (surtout si elles itérer sur une courte séquence) étaient moins efficaces que les interprétations de la liste.
Toutefois, en Python 3, nous avons décidé de fixer le "sale petit secret" des interprétations de la liste en utilisant la même stratégie de mise en œuvre que pour le générateur d'expressions. Ainsi, en Python 3, l'exemple ci-dessus (après modification de l'utilisation de l'impression(x) :-) apparaîtra à l'impression "d'avant", prouvant que le " x "dans la compréhension de liste temporairement ombre, mais ne remplace pas le" x " dans les environs du champ d'application.
Donc en Python 3, vous ne verrez pas cela se reproduire.
Il est intéressant de noter, dict interprétations en Python 2 ne pas le faire; c'est surtout parce que dict interprétations ont été réalignés à partir de Python 3 et en tant que tel déjà eu ce correctif.
Il y a d'autres questions qui traitent de ce sujet, mais je suis sûr que vous avez déjà vu ces lorsque vous avez effectué une recherche pour le sujet, non? ;)