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 позволяет изменять переменные в ближайшей внешней функции, создавая более инкапсулированные изменения состояния.