Часто на собеседованиях задают такие вопросы по Python, которые ставят в тупик даже опытных разработчиков. Вопросы не сложные — просто в повседневной деятельности либо не пользуешься тем, о чём спрашивают, либо не обращаешь внимания: настолько это уже вошло в привычку.
Так что этот цикл постов посвящён вопросам, которые часто задают на собеседованиях по Python, — чтобы глянуть перед собеседованием, если понадобится. И первый вопрос из этого списка: каковы правила для областей видимости локальных и глобальных переменных в Python?
Посмотрим на такой код:
def foo():
print(s)
s = "I'm global variable"
foo()Функция ожидаемо напечатает "I'm global variable". В Python переменная считается глобальной, если внутри нового неймспейса (внутри функции или класса) не создаётся локальная переменная с таким же именем. Код ниже напечатает "I'm local variable":
def foo():
s = "I'm local variable"
print(s)
s = "I'm global variable"
foo()Глобальные переменные можно использовать внутри вложенного неймспейса, если только не использовать их в левой части оператора присваивания либо не объявлять их внутри неймспейса с ключевым словом global.
def foo2():
global s
s = 'Reset global variable'
foo2() # меняем глобальную переменную
print(s)Важно! Python анализирует код функции не строчка за строчкой, а целиком. Так что следующий код свалится с ошибкой UnboundLocalError:
s = "I'm global variable"
def foo():
print(s)
s = 'Reset global variable'
foo()Вот как‑то так.