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

x = 10

def test():
    def inner():
        global x
        x = 15
    inner()

test()
print(x)

Код выведет число 15.

Функция inner() использует ключевое слово global, чтобы указать, что она работает с глобальной переменной x, а не создает локальную переменную с тем же именем. Поэтому, когда inner() присваивает x = 15, она изменяет значение глобальной переменной x.


Этот код содержит ошибку, так как переменная x не определена в глобальной области видимости до ее использования в функции inner.

Вот как код попытается выполниться:

  1. Функция test определена.
  2. Функция inner определена внутри test.
  3. Вызывается функция test().
  4. Внутри test() вызывается функция inner().
  5. Внутри inner() происходит объявление глобальной переменной x и присвоение ей значения 15.
  6. Функция test() завершает свою работу.
  7. После вызова test(), интерпретатор попытается выполнить print(x).

Проблема: Переменная x не была объявлена вне функции inner, то есть ее не было в глобальном пространстве имен до момента ее использования в `inner`. Ключевое слово global внутри inner создает глобальную переменную, если ее еще не было. Однако, перед вызовом test(), x не существует, но Python не поднимает ошибку в момент объявления `test()`. Ошибка произойдет только во время выполнения функции, а именно когда вы попытаетесь напечатать неопределенную глобальную переменную `x`.

Решение и исправление:

Чтобы исправить ошибку, необходимо либо определить x до вызова test(), либо обернуть print(x) в функцию и вызывать ее внутри test(). Пример:


x = 10  # Определяем x в глобальной области видимости (любое значение)

def test():
    def inner():
        global x
        x = 15
    inner()

test()
print(x) # Выведет 15
  

Теперь код будет работать, и на экран будет выведено 15. Другой вариант:


def test():
    x = None  # Локальная переменная x
    def inner():
        nonlocal x
        x = 15
    inner()
    print(x)

test()
# print(x) # NameError: name 'x' is not defined

  

В этом случае выведется 15, но переменная x будет существовать только в области видимости функции test().

Возможный вопрос интервьюера: Что будет, если убрать global?

Ответ: Если убрать global, функция inner создаст локальную переменную x внутри своей области видимости. Глобальная переменная x не будет изменена. После завершения test() при попытке print(x) возникнет ошибка NameError: name 'x' is not defined, так как глобальная переменная x никогда не была определена до вызова test.

0