x = 10
def test():
def inner():
global x
x = 15
inner()
test()
print(x)
Код выведет число 15.
Функция inner() использует ключевое слово global, чтобы указать, что она работает с глобальной переменной x, а не создает локальную переменную с тем же именем. Поэтому, когда inner() присваивает x = 15, она изменяет значение глобальной переменной x.
Этот код содержит ошибку, так как переменная x не определена в глобальной области видимости до ее использования в функции inner.
Вот как код попытается выполниться:
test определена.inner определена внутри test.test().test() вызывается функция inner().inner() происходит объявление глобальной переменной x и присвоение ей значения 15.test() завершает свою работу.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.