Область видимости переменных в Python

В Python переменные можно объявлять в трёх разных областях видимости: локальной, глобальной и нелокальной.

Область видимости переменной определяет область, где к переменной можно обращаться. Например,

def add_numbers():
    sum = 5 + 4

Здесь переменная sum создаётся внутри функции, поэтому к ней можно обращаться только внутри функции (локальная область видимости). Такая переменная называется локальной.

В зависимости от области видимости переменные Python делятся на три типа:

  1. Локальные переменные

  2. Глобальные переменные

  3. Нелокальные переменные


Локальные переменные

Когда мы объявляем переменные внутри функции, эти переменные имеют локальную область видимости (в пределах функции). Мы не можем обращаться к ним вне функции.

Такие переменные называются локальными. Например,

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 внешней функции внутри вложенной.

Примечание

Если мы изменяем значение нелокальной переменной, изменения отражаются в локальной переменной.