Как работает `nonlocal` и чем он отличается от `global`?

nonlocal позволяет получить доступ к переменной из ближайшей охватывающей (enclosing) области видимости, которая не является глобальной. То есть, ищет переменную уровнем выше, внутри функции, в которой определена текущая функция.

global, в свою очередь, позволяет получить доступ к переменной из глобальной области видимости, то есть вне всех функций, на уровне модуля.

Основное различие: nonlocal для доступа к переменным во вложенных функциях, global для доступа к переменным на уровне модуля. Использовать nonlocal можно только внутри вложенной функции.


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

global

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

Пример:

x = 10  # Глобальная переменная

def my_function():
  global x
  x = 20  # Изменяем глобальную переменную x

my_function()
print(x)  # Вывод: 20

Без использования global, внутри функции была бы создана локальная переменная x, и глобальная переменная осталась бы равной 10.

nonlocal

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

Пример:

def outer_function():
  x = 10  # Переменная во внешней функции

  def inner_function():
    nonlocal x
    x = 20  # Изменяем переменную x во внешней функции

  inner_function()
  print(x)  # Вывод: 20

outer_function()

Здесь nonlocal x в inner_function сообщает Python, что x относится к переменной x, определенной в outer_function. Без nonlocal, в inner_function была бы создана новая локальная переменная x, и значение x в outer_function осталось бы равным 10.

Основные отличия:

  • global относится к переменным в глобальной области видимости (вне всех функций, в пространстве имен модуля). nonlocal относится к переменным в области видимости внешней функции, для вложенных функций.
  • global используется для доступа к глобальным переменным, а nonlocal - для доступа к переменным в родительской (неглобальной) области видимости.
  • nonlocal можно использовать только во вложенных функциях. global можно использовать в любой функции (если требуется доступ к глобальной переменной).

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

0