Подтвердить что ты не робот

Python 3: UnboundLocalError: локальная переменная, указанная перед назначением

Следующий код дает ошибку UnboundLocalError: local variable 'Var1' referenced before assignment:

Var1 = 1
Var2 = 0
def function(): 
    if Var2 == 0 and Var1 > 0:
        print("Result One")
    elif Var2 == 1 and Var1 > 0:
        print("Result Two")
    elif Var1 < 1:
        print("Result Three")
    Var1 =- 1
function()

Как я могу это исправить? Спасибо за любую помощь!

4b9b3361

Ответ 1

Вы можете исправить это, передав параметры, а не полагаясь на Globals

def function(Var1, Var2): 
    if Var2 == 0 and Var1 > 0:
        print("Result One")
    elif Var2 == 1 and Var1 > 0:
        print("Result Two")
    elif Var1 < 1:
        print("Result Three")
    return Var1 - 1
function(1, 1)

Ответ 2

Это связано с тем, что, хотя Var1 существует, вы также используете оператор присваивания имени Var1 внутри функции (Var1 -= 1 в нижней строке). Естественно, это создает переменную внутри области видимости функции Var1 (правда, -= или += будет только обновлять (переназначать) существующую переменную, но по неизвестным причинам (вероятная согласованность в этом контексте) Python рассматривает ее как задание). Интерпретатор Python видит это во время загрузки модуля и правильно решает, что глобальная область Var1 не должна использоваться внутри локальной области, что приводит к проблеме, когда вы пытаетесь ссылаться на переменную до ее локального назначения.

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

global Var1, Var2

внутри верхней части вашей функции. Это скажет Python, что вы не собираетесь определять переменную Var1 или Var2 внутри локальной области функций. Интерпретатор Python видит это во время загрузки модуля и решает (правильно) искать любые ссылки на вышеупомянутые переменные в глобальной области.

Ответ 3

Если вы установите значение переменной внутри функции, python понимает ее как создание локальной переменной с этим именем. Эта локальная переменная маскирует глобальную переменную.

В вашем случае Var1 рассматривается как локальная переменная и используется до его установки, таким образом, ошибка.

Чтобы решить эту проблему, вы можете явно сказать ее глобальную, вставив global Var1 в вашу функцию.

Var1 = 1
Var2 = 0
def function():
    global Var1
    if Var2 == 0 and Var1 > 0:
        print("Result One")
    elif Var2 == 1 and Var1 > 0:
        print("Result Two")
    elif Var1 < 1:
        print("Result Three")
    Var1 =- 1
function()

Ответ 4

Мне не нравится это поведение, но так работает Python. На вопрос уже были ответы другие, но для полноты, позвольте мне указать, что Python 2 имеет больше таких причуд.

def f(x):
    return x

def main():
    print f(3)
    if (True):
        print [f for f in [1, 2, 3]]

main()

Python 2.7.6 возвращает ошибку:

Traceback (most recent call last):
  File "weird.py", line 9, in <module>
    main()
  File "weird.py", line 5, in main
    print f(3)
UnboundLocalError: local variable 'f' referenced before assignment

Python видит, что f используется как локальная переменная в [f for f in [1, 2, 3]], и решает, что она также является локальной переменной в f(3). Вы можете добавить оператор global f:

def f(x):
    return x

def main():
    global f
    print f(3)
    if (True):
        print [f for f in [1, 2, 3]]

main()

Это работает; однако f становится 3 в конце... То есть print [f for f in [1, 2, 3]] теперь изменяет глобальную переменную f на 3, поэтому она больше не является функцией.

К счастью, он отлично работает в Python3 после добавления скобок в print.

Ответ 5

Почему бы просто не вернуть вычисленное значение и не позволить вызывающему агенту изменить глобальную переменную. Не рекомендуется манипулировать глобальной переменной внутри функции, как показано ниже:

Var1 = 1
Var2 = 0

def function(): 
    if Var2 == 0 and Var1 > 0:
        print("Result One")
    elif Var2 == 1 and Var1 > 0:
        print("Result Two")
    elif Var1 < 1:
        print("Result Three")
    return Var1 - 1

Var1 = function()

или даже создавать локальные копии глобальных переменных и работать с ними и возвращать результаты, которые вызывающий может затем соответствующим образом назначить

def function():
v1, v2 = Var1, Var2
# calculate using the local variables v1 & v2
return v1 - 1

Var1 = function()