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


def outer():
    x = 5
    def inner():
        global x
        x = 10
    inner()
    return x

print(outer())

Код выведет 5. Функция inner использует ключевое слово global, но при этом изменяет глобальную переменную x, которая определена *вне* функции outer. Локальная переменная x в outer не затрагивается. Таким образом, outer возвращает значение своей локальной переменной x, которая равна 5.

Разбор кода и объяснение результата:

Данный код демонстрирует взаимодействие локальных и глобальных переменных в Python, а также влияние ключевого слова global.

  1. Функция outer() определена. Она содержит локальную переменную x, инициализированную значением 5.
  2. Внутри outer() определена вложенная функция inner().
  3. Функция inner() использует ключевое слово global x. Это означает, что внутри inner() переменная x относится к глобальной переменной, а не к локальной переменной функции outer().
  4. Внутри inner() глобальная переменная x изменяется на 10. Важно: Это изменение влияет на глобальную область видимости, а не на локальную x в outer().
  5. Функция inner() вызывается внутри outer().
  6. Функция outer() возвращает значение своей локальной переменной x, которая не была изменена вызовом inner(), так как inner() изменила глобальную переменную x.
  7. Вне всех функций, print(outer()) вызывает outer() и выводит возвращаемое ей значение.

Результат:

Код выведет 5.

Почему 5?

Потому что функция outer() возвращает значение своей локальной переменной x, которая инициализирована значением 5 и не изменяется внутри outer(). Функция inner() изменяет глобальную переменную x, что не влияет на локальную переменную x функции outer().

Пример глобальной переменной:


x = 1  # Глобальная переменная

def outer():
    x = 5  # Локальная переменная outer()
    def inner():
        global x
        x = 10  # Изменяет ГЛОБАЛЬНУЮ x
    inner()
    print("x внутри outer:", x)  # Выведет 5
    print("Глобальная x после inner:", globals()['x']) #выведет 10

outer()
print("Глобальная x после outer:", x)  # Выведет 10
  
0