nonlocal вместо global следует, когда необходимо изменить переменную в ближайшей внешней неглобальной области видимости (например, во вложенной функции), а не в глобальной области видимости. global же используется для изменения переменных в глобальной области видимости из локальной области видимости функции.
nonlocal и global оба используются для доступа к переменным, находящимся вне текущей области видимости, но у них разные цели и области применения:
global используется для доступа к переменным, находящимся в глобальной области видимости.  Глобальная область видимости обычно относится к области видимости модуля. Когда вы объявляете переменную как global внутри функции, вы говорите, что хотите работать с переменной, которая определена на уровне модуля (вне этой функции).
nonlocal используется для доступа к переменным, находящимся во внешней неглобальной области видимости.  Это означает, что nonlocal используется внутри вложенной функции (внутренней функции), чтобы изменить переменную, определенную в ближайшей внешней функции (функции, в которой она непосредственно вложена), но не в глобальной области видимости. nonlocal позволяет "подняться" на один уровень вверх по области видимости функций.
Когда использовать nonlocal вместо global:
nonlocal позволяет вам изменять переменные, которые принадлежат замыканию (closure).nonlocal помогает сохранить состояние переменной внутри конкретного набора вложенных функций, ограничивая ее видимость и избегая загрязнения глобальной области видимости.  Это способствует лучшему контролю над данными и уменьшает риск случайного изменения глобальных переменных.Пример:
def outer_function():
    x = 10
    def inner_function():
        nonlocal x  # Изменяет x внешней функции
        x = 20
        print("В inner_function:", x)
    inner_function()
    print("В outer_function:", x)
outer_function()
# Вывод:
# В inner_function: 20
# В outer_function: 20
    В этом примере, если бы мы использовали global x в inner_function, то мы бы попытались изменить глобальную переменную x (если бы такая существовала), а не переменную x в outer_function. Без nonlocal переменная x в inner_function была бы локальной для этой функции, и изменение ее значения не повлияло бы на x в outer_function.
Ключевое различие: global для доступа к глобальным переменным, nonlocal для доступа к переменным во внешней (но не глобальной) области видимости во вложенных функциях.