Старое поведение было ошибкой, но его нельзя было легко исправить, так как на него полагался какой-то код.
Переменная i
в понимании списка должна отличаться от i
от той, что вверхний уровень.По логике он должен иметь свою собственную область, которая не выходит за пределы понимания, поскольку его значение имеет смысл только внутри понимания.Но в Python 2.x из-за деталей реализации область действия была больше, чем необходимо, что приводило к тому, что переменная «просачивалась» во внешнюю область, вызывая запутанные результаты, которые вы видите.
Python 3.0 был намеренно не предназначен дляобратно совместимы с предыдущими выпусками, поэтому они использовали возможность исправить это нежелательное поведение.
В Python 2.3 и более поздних выпусках понимание списка «пропускает» управляющие переменные каждого из них, содержащиеся в нем, в содержащийобъем.Тем не менее, это поведение устарело, и полагаться на него не будет работать в Python 3.0
Source