x = 2
def outer():
def inner():
nonlocal x
x = 3
inner()
return x
print(outer())
x = 2
: Глобальная переменная x инициализируется значением 2.outer()
: Вызывается внешняя функция.inner()
: Внутри outer()
вызывается вложенная функция inner()
.nonlocal x
: Объявление в inner()
указывает, что x
относится к переменной из ближайшей неглобальной области видимости, то есть к переменной x
в outer()
.x = 3
: В inner()
переменная x
(из области видимости outer()
) изменяется на 3.return x
: outer()
возвращает значение x
, которое равно 3.print(outer())
: Выводится возвращенное значение, то есть 3.Данный код иллюстрирует использование ключевого слова nonlocal
в Python.
Порядок выполнения:
x = 2
: Переменная x
инициализируется значением 2 в глобальной области видимости.outer()
: Вызывается функция outer
.outer()
:
inner()
определена.inner()
.inner()
:
nonlocal x
: Указывает, что переменная x
, используемая внутри inner()
, находится в ближайшей внешней (не глобальной) области видимости. В данном случае, это область видимости функции outer()
.x = 3
: Переменной x
в области видимости outer()
присваивается значение 3. Важно! Эта операция не затрагивает глобальную переменную x
.inner()
завершается.return x
: Функция outer()
возвращает значение переменной x
, которое теперь равно 3 (так как оно было изменено в inner()
).print(outer())
: Выводит возвращаемое значение outer()
, которое равно 3.Ключевые моменты:
nonlocal
: Позволяет внутренней функции изменять переменную, объявленную в ближайшей внешней (не глобальной) области видимости.nonlocal
, попытка присвоить значение x
в inner()
создала бы локальную переменную x
внутри inner()
, не затрагивая x
в outer()
.x
не была определена во внешней области видимости функции inner
(т.е. если бы не было строчки `x = 2` и `x = 3` в `outer`), то возникла бы ошибка NameError
.Вывод:
Программа выведет число 3
.