Область видимости локальных переменных
Содержание курса
NameError: что происходит при обращении к локальной переменной извне
Изоляция локальных переменных — не просто теория. Если попробовать обратиться к локальной переменной снаружи функции, Python немедленно даст об этом знать.
Вот минимальный пример:
def calc():
result = 42
calc()
print(result) # NameError: name 'result' is not defined
Функция calc выполнилась, переменная result внутри неё была создана и получила значение 42. Но как только функция завершила работу — её локальное пространство имён прекратило существование. Переменная result вместе с ним.
Когда интерпретатор доходит до строки print(result), он начинает искать имя result в глобальной области видимости. Там его нет — оно никогда туда не попадало.
Результат: NameError: name 'result' is not defined.
Важно понимать: ошибка возникает не в момент объявления переменной внутри функции и не в момент вызова calc(). Она возникает позже — когда глобальный код пытается использовать имя, которого в его области видимости не существует. Это ошибка времени выполнения (runtime error), и Python сообщает о ней в тот момент, когда натыкается на проблему, а не заранее.
Сообщение NameError: name 'result' is not defined означает буквально: «я не знаю никакой переменной с именем result в том месте, откуда вы её вызываете». Это не значит, что переменная написана с опечаткой — она вполне реально существовала, но в другой области видимости и уже исчезла.
Для сравнения: если переменная вообще нигде не объявлена, ошибка будет той же самой. Python не различает «переменная была, но стала недоступна» и «переменная не существовала никогда» — в обоих случаях он просто не находит имя в текущей области видимости и выдаёт NameError.
