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
, а не глобальной.