Области видимости переменных в Python

Опубликовано 07 September 2015 в Python

Часто на собеседованиях задают такие вопросы по Python, которые ставят в тупик даже опытных разработчиков. Вопросы не сложные, просто в повседневной деятельности либо не пользуешься тем о чем спрашивают, либо не обращаешь внимание, настолько это уже вошло в привычку.

Так что этот цикл постов посвящен вопросам, которые часто задают на собеседованиях по питону, что бы глянуть перед собеседованием, если понадобится. И первый вопрос из этого списка: каковы правила для областей видимости локальных и глобальных переменных в Python.

Посмотрим на такой код:

def foo():
    print(s)

s = "I'm global variable"
foo()

Функция ожидаемо напечатает "I'm global variable". В питоне переменные глобальные, если внутри нового неймспейса (внутри функции или класса) не создается локальная переменная с таким же именем. Код ниже напечатает "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)

Важно! Питон анализирует код функции не строчка за строчкой, а целиком. Так что следующий код свалится с ошибкой UnboundLocalError:

s = "I'm global variable"

def foo():
    print(s)
    s = 'Reset global variable'

foo()

Вот как-то так. Какие вопросы по питону на собеседованиях задавали вам?

---
Возник вопрос? Мне всегда можно написать в Twitter: avkorablev