Часто на собеседованиях задают такие вопросы по 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()

Вот как‑то так.