Что выведет этот код?


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, но на вывод это не влияет.

Разберем код построчно, чтобы понять, что произойдет.

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

Результат: На консоль будет выведено число 10.

Важные моменты:

  • Использование global x позволяет функции inner модифицировать глобальную переменную x.
  • Внутри функции test создается локальная переменная x, которая перекрывает глобальную переменную x в области видимости функции test, но только если глобальная переменная с таким именем не объявлена как global в этой функции. В данном случае глобальная переменная не перекрывается, так как она явно объявлена global во вложенной функции inner.
  • Функция test возвращает значение своей локальной переменной x, а не глобальной.
0