x = 0
def test():
    x = 10
    def inner():
        global x
        x = 20
    inner()
    return x
print(test())
10.
x = 0: Глобальная переменная x инициализируется значением 0.test():  Вызывается функция test().x = 10: Внутри test() создается локальная переменная x со значением 10.inner(): Вызывается функция inner().global x: Внутри inner() объявляется, что x - это глобальная переменная.x = 20: Глобальная переменная x теперь принимает значение 20.  (но это не влияет на локальную переменную x внутри test())return x: Функция test() возвращает значение локальной переменной x, которая равна 10.print(test()): Выводится возвращенное значение, то есть 10. Глобальная переменная x при этом равна 20, но на вывод это не влияет.Разберем код построчно, чтобы понять, что произойдет.
x = 0: Определяется глобальная переменная x и ей присваивается значение 0.def test():: Определяется функция test.x = 10: Внутри функции test определяется локальная переменная x и ей присваивается значение 10.  Важно отметить, что эта x отличается от глобальной x.def inner():: Определяется вложенная функция inner.global x: Внутри функции inner объявляется, что переменная x, к которой будет происходить обращение, это глобальная переменная x, а не какая-либо локальная.x = 20: Внутри функции inner глобальной переменной x присваивается значение 20.inner(): Вызывается функция inner. Этот вызов изменяет значение глобальной переменной x на 20.return x: Функция test возвращает значение локальной переменной x, которая была определена внутри функции test и равна 10.  Глобальная переменная x в этой строке не используется.print(test()): Вызывается функция test, возвращаемое значение (10) передается в функцию print для вывода на экран.Результат: На консоль будет выведено число 10.
Важные моменты:
global x позволяет функции inner модифицировать глобальную переменную x.test создается локальная переменная x, которая перекрывает глобальную переменную x в области видимости функции test, но только если глобальная переменная с таким именем не объявлена как global в этой функции. В данном случае глобальная переменная не перекрывается, так как она явно объявлена global во вложенной функции inner.test возвращает значение своей локальной переменной x, а не глобальной.