Dawne zachowanie było błędem, ale nie można go było łatwo naprawić, ponieważ opierał się na nim jakiś kod.
Zmienna i
na liście powinna być inna niż i
od tej na najwyższym poziomie. Logicznie rzecz biorąc, powinien on mieć swój własny zakres, który nie wykracza poza pojmowanie, ponieważ jego wartość ma sens jedynie w rozumieniu. Ale w Pythonie 2.x ze względu na szczegóły implementacji zakres był większy niż to konieczne, powodując, że zmienna "wyciekła" do zewnętrznego zakresu, powodując dezorientujące wyniki.
Python 3.0 celowo nie miał być kompatybilny wstecz z poprzednimi wersjami, więc wykorzystali okazję, aby naprawić to niepożądane zachowanie.
W wydaniach Python 2.3 i nowszych, zrozumienie listy "przecieka" zmienne kontrolne każdego z nich do zakresu zawierającego. Jednak takie zachowanie jest przestarzała, a opierając się na nim nie zadziała w Pythonie 3,0
Source
Wow. Mam szczęście, że znalazłem to tutaj, szukałem błędu przez wiele tygodni, gdybym natknął się na to we własnym kodzie. +1 dla pytania, -1 dla Pythona :( – Kos
Podobne pytanie tutaj: http://stackoverflow.com/questions/4198906/python-list-comprehension-rebind-names-even-after-skope-of-comprehension-is- to –