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
.