Вопрос касается понимания областей видимости (scopes) в Python и взаимодействия между локальными функциями и глобальными переменными. Использование global внутри локальной (вложенной) функции для переменной, объявленной в другой (охватывающей) функции, невозможно и приведёт к ошибке.
Конструкция global используется для указания, что переменная, к которой происходит обращение, находится в глобальной области видимости, то есть вне какой-либо функции, на уровне модуля. global не позволяет напрямую обращаться к переменным, объявленным во внешней, охватывающей функции (в её локальной области видимости).
Чтобы обратиться к переменной из внешней функции, необходимо использовать ключевое слово nonlocal. nonlocal позволяет модифицировать переменную в ближайшей неглобальной области видимости. Однако, если переменная не объявлена во внешней функции, а затем внутри локальной функции попытаться объявить её как global, то это создаст новую глобальную переменную, а не свяжет её с переменной из внешней функции.
Пример, демонстрирующий проблему:
def outer_function():
x = 10
def inner_function():
global x # Попытка обратиться к x как к глобальной
x = 20 # Изменение глобальной переменной, а не x из outer_function
print("Inner:", x)
inner_function()
print("Outer:", x)
outer_function()
print("Global:", x) # Продемонстрирует изменение глобальной x
Результат выполнения кода:
Inner: 20
Outer: 10
Global: 20
В этом примере global x внутри inner_function создаёт новую глобальную переменную x, а не изменяет x, определённую в outer_function. Таким образом, x в outer_function остаётся неизменной. На уровне модуля также изменяется глобальная переменная `x`.
Для доступа и изменения переменной из внешней функции, следует использовать nonlocal:
def outer_function():
x = 10
def inner_function():
nonlocal x # Указываем, что x из охватывающей области видимости
x = 20
print("Inner:", x)
inner_function()
print("Outer:", x)
outer_function()
Результат выполнения кода:
Inner: 20
Outer: 20
В этом случае nonlocal x позволяет inner_function изменить переменную x, объявленную в outer_function.
Вывод: Использование global для доступа к переменной из внешней функции невозможно. Для этого предназначен оператор nonlocal. Если переменная с указанным именем не существует в глобальной области видимости и при этом используется global внутри локальной функции, то будет создана новая глобальная переменная.