x = 5
def outer():
x = 10
def inner():
nonlocal x
x = 15
inner()
return x
print(outer())
SyntaxError: nonlocal declaration not allowed at module level
.
Оператор nonlocal
используется для переменных, объявленных во внешней, но не глобальной области видимости.
В данном случае, переменная x
внутри inner
не может быть одновременно и global
и nonlocal
.
Если убрать global x
, то будет ошибка SyntaxError: no binding for nonlocal 'x' found
, так как x = 10
во внешней функции, а это не внешняя область видимости.
Разберем код построчно:
x = 5
: Определяет глобальную переменную x
и присваивает ей значение 5.def outer():
: Определяет функцию outer
.x = 10
: Внутри outer
создается локальная переменная x
, которая "затеняет" глобальную x
. Ей присваивается значение 10.def inner():
: Определяет вложенную функцию inner
.global x
: Внутри inner
объявляется, что переменная x
, используемая в этой функции, ссылается на глобальную переменную x
(определенную вне outer
).nonlocal x
: **Эта строка вызовет ошибку.** nonlocal
может использоваться только для переменных, определенных в ближайшей *неглобальной* области видимости (enclosing scope). В данном случае, global x
уже говорит, что мы работаем с глобальной переменной. Попытка использовать nonlocal x
после global x
недопустима, так как переменная уже явно определена как глобальная.x = 15
: Если бы предыдущая строка не вызвала ошибку, эта строка присвоила бы значение 15 *глобальной* переменной x
.inner()
: Вызывает функцию inner
.return x
: Возвращает значение *локальной* переменной x
, определенной в функции outer
(то есть x = 10
). Значение этой переменной не менялось.print(outer())
: Вызывает функцию outer
и выводит возвращенное значение в консоль.Результат:
Код завершится с ошибкой SyntaxError: name 'x' is nonlocal and global
из-за одновременного использования global
и nonlocal
для одной и той же переменной x
в функции inner
.
Исправленный код (если требуется изменение только значения локальной x в outer):
x = 5
def outer():
x = 10
def inner():
nonlocal x
x = 15
inner()
return x
print(outer())
В исправленном коде, результат будет 15
, так как nonlocal x
указывает на переменную x
в outer
, и ее значение изменяется на 15 внутри inner
.
Исправленный код (если требуется изменение только глобальной x):
x = 5
def outer():
x = 10
def inner():
global x
x = 15
inner()
return x
print(outer())
В данном случае результатом будет 10
. Функция inner
изменяет глобальную переменную x
на 15, но это не влияет на локальную переменную x
в outer
, которая возвращается функцией outer
.