x = 1
def outer():
    def inner():
        global x
        x = 2
    inner()
    return x
print(outer())
inner() изменяет глобальную переменную x, используя ключевое слово global.  Поэтому, когда outer() возвращает x, возвращается измененное значение (2), а не локальная переменная.
   Разберем код по шагам, чтобы понять, что будет выведено.  Важно понимать, как работают области видимости (scope) и ключевое слово global в Python.
  
x и ей присваивается значение 1.
   outer().
   outer() определяется функция inner().
   inner() используется ключевое слово global x. Это означает, что внутри inner() переменная x относится к глобальной переменной x, а не к локальной переменной с тем же именем.
   x присваивается значение 2. Важно, что это изменение происходит *глобально*.
   inner() вызывается внутри outer(). После этого вызова, глобальная переменная x теперь имеет значение 2.
   outer() возвращает значение x.  Так как inner() изменила глобальную переменную x, функция outer() возвращает текущее значение глобальной переменной x, которое равно 2.
   outer(), и её возвращаемое значение (2) выводится на экран.
   
   Таким образом, программа выведет 2.
  
Вывод:
2