Почему переменная из if доступна снаружи, а из функции - нет?
Думал, что любые блоки с отступами создают новую область видимости, но оказалось, что это не так. В каких ещё конструкциях переменные "вытекают" наружу, а в каких — нет?
1 ответ
В Python новую область видимости создают только функции (def, lambda), классы и сам модуль. Отступы ни при чём: if, for, while, try, with — просто управляющие конструкции, их переменные живут в той же области, что и окружающий код.
Поэтому «вытекает» всё: из if/else, из for (переменная цикла после него остаётся и хранит последнее значение), из try/except, из with — файл из with open(...) as f доступен и после блока, просто уже закрыт.
Не вытекают: локальные переменные функций, их параметры и переменная внутри comprehension — [x for x in range(5)] наружу x не выпускает, у него с Python 3 своя мини-область.
В JS граница проходит иначе: let и const живут в пределах блока { }, а var — в пределах функции, примерно как в Python. Отсюда и путаница у тех, кто пришёл из JS.