Python область, когда назначение никогда не выполняется - PullRequest
2 голосов
/ 05 апреля 2020

Итак, я получаю, что

x = 5
def f():
    print(x)

f()
print(x)

возвращает 5 и 5.

Я также получаю, что

x = 5
def f():
    x = 7
    print(x)

f()
print(x)

возвращает 7 и 5.

Что не так со следующим?

x = 5
def f():
    if False:
        x = 7   
        print(x)
    else:
        print(x)

f()
print(x)

Я бы предположил, что, поскольку x=7 никогда не происходит, я должен получить 5 и 5 снова. Вместо этого я получаю

UnboundLocalError: local variable 'x' referenced before assignment

Считает ли python x локальной переменной, потому что в этом блоке с отступом есть выражение присваивания независимо от того, выполняется оно или нет? Какое именно правило?

Ответы [ 3 ]

4 голосов
/ 05 апреля 2020

Когда функция определена, python интерпретирует x как локальную переменную, поскольку она назначена внутри тела функции. Во время выполнения, когда вы go вводите предложение else, интерпретатор ищет локальную переменную x, которая не назначена.

Если вы хотите, чтобы оба значения x ссылаясь на ту же переменную, вы можете добавить global x внутри тела функции перед ее назначением, чтобы по существу сказать python , когда я вызову x Я буду ссылаться на глобальную область действия x .

2 голосов
/ 05 апреля 2020

Если операция привязки имени происходит где-либо в блоке кода, все использования имени в блоке рассматриваются как ссылки на текущий блок. Это может привести к ошибкам, когда имя используется внутри блока до его привязки. Это правило неуловимо. Python не содержит объявлений и позволяет выполнять операции привязки имен в любом месте блока кода. Локальные переменные кодового блока могут быть определены путем сканирования всего текста блока на наличие операций связывания имен.

0 голосов
/ 05 апреля 2020

Вам нужно использовать global в своей функции f(), например, так:

x = 5
def f():
    global x
    if False:
        x = 7   
        print(x)
    else:
        print(x)

f()
print(x)
...