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