Область видимости переменных в Python
В Python переменные можно объявлять в трёх разных областях видимости: локальной, глобальной и нелокальной.
Область видимости переменной определяет область, где к переменной можно обращаться. Например,
def add_numbers():
sum = 5 + 4
Здесь переменная sum создаётся внутри функции, поэтому к ней можно обращаться только внутри функции (локальная область видимости). Такая переменная называется локальной.
В зависимости от области видимости переменные Python делятся на три типа:
Локальные переменные
Глобальные переменные
Нелокальные переменные
Локальные переменные
Когда мы объявляем переменные внутри функции, эти переменные имеют локальную область видимости (в пределах функции). Мы не можем обращаться к ним вне функции.
Такие переменные называются локальными. Например,
def greet():
# локальная переменная
message = 'Hello'
print('Local', message)
greet()
# попытка обратиться к переменной message
# вне функции greet()
print(message)
Вывод
Local Hello
NameError: name 'message' is not defined
Здесь переменная message локальная для функции greet(), поэтому к ней можно обращаться только внутри функции.
Поэтому мы получаем ошибку при попытке обратиться к ней вне функции greet().
Чтобы исправить это, можно сделать переменную message глобальной.
Глобальные переменные
В Python переменная, объявленная вне функции или в глобальной области видимости, называется глобальной. Это означает, что к глобальной переменной можно обращаться как внутри, так и вне функции.
Рассмотрим пример создания глобальной переменной в Python:
# объявление глобальной переменной
message = 'Hello'
def greet():
# объявление локальной переменной
print('Local', message)
greet()
print('Global', message)
Вывод
Local Hello
Global Hello
На этот раз мы можем обратиться к переменной message вне функции greet(). Это потому, что мы создали message как глобальную переменную.
# объявление глобальной переменной
message = 'Hello'
Теперь message будет доступна из любой области (региона) программы.
Нелокальные переменные
В Python ключевое слово nonlocal используется внутри вложенных функций, чтобы указать, что переменная не является локальной для внутренней функции, а принадлежит области видимости охватывающей функции.
Это позволяет изменять переменную внешней функции внутри вложенной, при этом отделяя её от глобальных переменных.
# внешняя функция
def outer():
message = 'local'
# вложенная функция
def inner():
# объявление нелокальной переменной
nonlocal message
message = 'nonlocal'
print("inner:", message)
inner()
print("outer:", message)
outer()
Вывод
inner: nonlocal
outer: nonlocal
В приведённом примере есть вложенная функция inner(). Функция inner() определена в области видимости другой функции outer().
Мы использовали ключевое слово nonlocal, чтобы изменить переменную message внешней функции внутри вложенной.
Примечание
Если мы изменяем значение нелокальной переменной, изменения отражаются в локальной переменной.