Почему `nonlocal` нельзя использовать для переменных, которые находятся в глобальной области видимости?

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

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

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

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

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

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

Пример:

        
def outer_function():
    x = 10

    def inner_function():
        nonlocal x  # Корректно: x находится в замкнутой области видимости outer_function
        x = 20
        print("inner:", x)

    inner_function()
    print("outer:", x)

outer_function()

# А вот это вызовет ошибку:
# global_var = 5
# def my_function():
#     nonlocal global_var # SyntaxError: no binding for nonlocal 'global_var' found
#     global_var = 10
# my_function()

global_var = 5
def my_function():
    global global_var
    global_var = 10

my_function()
print(global_var) # Output: 10
        
    
0