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