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

В этом руководстве вы узнаете о нелокальных областях видимости в Python и о том, как использовать ключевое слово nonlocal для изменения переменных нелокальных областей.

Введение в нелокальные области видимости в Python

В Python вы можете определить функцию внутри другой функции. Например:

def outer():
    print('outer function')

    def inner():
        print('inner function')

    inner()


outer()

Выход:

outer function
inner function

В этом примере мы определили функцию под названием external.

Внутри внешней функции мы определили другую функцию, называемую внутренней. И мы вызвали внутреннюю функцию изнутри внешней функции. Часто мы говорим, что внутренняя функция вложена во внешнюю функцию. На практике вы определяете вложенные функции, когда не хотите, чтобы эти функции были глобальными.

И внешние, и внутренние имеют доступ к глобальным и встроенным областям, а также к их локальным областям. И внутренняя функция также имеет доступ к охватывающей ее области, которая является областью действия внешней функции.

С точки зрения функции Internal() ее объем не является ни локальным, ни глобальным. И Python называет это нелокальной областью видимости.

Давайте изменим внешние и внутренние функции:

def outer():
    message = 'outer function'
    print(message)

    def inner():
        print(message)

    inner()


outer()

Выход:

outer function
outer function

Когда мы вызываем внешнюю функцию, Python создает внутреннюю функцию и выполняет ее.

Когда внутренняя функция выполняется, Python не находит переменную сообщения в локальной области. Поэтому Python ищет ее во внешней области видимости, которая является областью видимости внешней функции:

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

См. следующий пример:

message = 'global scope'


def outer():

    def inner():
        print(message)

    inner()


outer()

Выход:

global scope

В этом примере Python ищет переменную message в локальной области внутренней функции.

Поскольку Python не находит переменную, он ищет переменную в охватывающей ее области, которая является областью действия внешней функции.

И в этом случае Python обращается к глобальной области видимости, чтобы найти переменную:

Нелокальные области Python — поиск переменных

Ключевое слово nonlocal в Python

Чтобы изменить переменные из нелокальной области в локальной области, используйте ключевое слово nonlocal. Например:

def outer():
    message = 'outer scope'
    print(message)

    def inner():
        nonlocal message
        message = 'inner scope'
        print(message)

    inner()

    print(message)


outer()

Выход:

outer scope
inner scope
inner scope

В этом примере мы используем ключевое слово nonlocal, чтобы явно указать Python, что мы модифицируем нелокальную переменную.

Когда вы используете ключевое слово nonlocal для переменной, Python будет искать переменную в охватывающей ее цепочке локальных областей до тех пор, пока не встретит имя переменной. Что еще более важно, Python не будет искать переменную в глобальной области видимости.

Рассмотрим следующий пример:

message = 'outer scope'


def outer():
    print(message)

    def inner():
        nonlocal message
        message = 'inner scope'
        print(message)

    inner()

    print(message)


outer()

Если вы запустите этот код, вы получите следующую ошибку:

SyntaxError: no binding for nonlocal 'message' found

Внутри внутренней функции мы используем ключевое слово nonlocal для переменной message.

Поэтому Python ищет переменную сообщения во внешней области видимости, которая является областью действия внешней функции.

Поскольку в области внешней функции нет переменной сообщения, а Python не смотрит дальше в глобальной области, он выдает ошибку:

Нелокальные области Python — ключевое слово nonlocal

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *