def test():
    x = 10
    def inner():
        nonlocal x
        x = 20
    inner()
    return x
print(test())
20. 
  Ключевое слово nonlocal позволяет функции inner изменить значение переменной x, объявленной в окружающей (но не глобальной) области видимости (в данном случае, в функции test).  Таким образом, когда inner присваивает x значение 20, это изменение отражается и на переменной x в функции test.
Вопрос: Какой результат выведет данный код?
def test():
    x = 10
    def inner():
        nonlocal x
        x = 20
    inner()
    return x
print(test())
  Ответ: 20
Разъяснение:
test() инициализирует локальную переменную x со значением 10.test() определяется вложенная функция inner().nonlocal в inner() указывает, что переменная x, которую мы собираемся модифицировать, находится в ближайшей внешней (неглобальной) области видимости, то есть в области видимости функции test().inner() вызывается, она изменяет значение x в test() на 20.test() возвращает измененное значение x, которое теперь равно 20.print() выводит возвращенное значение, то есть 20.Таким образом, использование nonlocal позволяет вложенной функции изменять переменную, определенную в окружающей её функции.