← Все вопросы

Почему переменная из if доступна снаружи, а из функции - нет?

Задан 2 месяца назад20 просмотров1 ответ
1

Думал, что любые блоки с отступами создают новую область видимости, но оказалось, что это не так. В каких ещё конструкциях переменные "вытекают" наружу, а в каких — нет?

1 ответ

2

В 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.

Ваш ответ

, чтобы ответить на вопрос.