Python 3: UnboundLocalError: локальная переменная, на которую ссылаются перед назначением [дубликат]
этот вопрос уже есть ответ здесь:
- Ошибка области видимости переменной Python 10 ответов
следующий код выдает ошибку 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()
Как я могу это исправить? Спасибо за любую помощь!
5 ответов:
вы можете исправить это, передавая параметры, а не полагаясь на глобалы
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)
это потому, что, хотя
Var1существует, вы также используете оператор присваивания имениVar1внутри функции (Var1 -= 1в нижней строке). Естественно, это создает переменную внутри области действия функции с именемVar1(честно говоря, a-=или+=будет только обновлять (переназначать) существующую переменную, но по неизвестным причинам (вероятно, согласованность в этом контексте) Python рассматривает ее как назначение). Интерпретатор Python видит это во время загрузки модуля и решает (правильно так), что глобальная областьVar1Не следует использовать внутри локальной области, что приводит к проблеме при попытке ссылаться на переменную перед ее локальным назначением.использование глобальных переменных, помимо необходимости, обычно не одобряется разработчиками Python, потому что это приводит к запутанному и проблемному коду. Однако, если вы хотите использовать их для выполнения того, что подразумевает ваш код, вы можете просто добавить:
global Var1, Var2внутри верхней вашей функции. Это скажет Python, что вы не собираетесь определять
Var1илиVar2переменная внутри локальной области действия функции. Интерпретатор Python видит это во время загрузки модуля и решает (правильно) искать любые ссылки на вышеупомянутые переменные в глобальной области.Ресурсы
- на сайте Python есть объяснение для этой общей проблемы.
- Python 3 предлагает связанный
nonlocalзаявление-проверьте это также.
Если вы задаете значение переменной внутри функции, 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()
мне не нравится это поведение, но так работает 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 assignmentPython видит тег
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 после добавления скобок в
почему бы просто не вернуть вычисленное значение и позволить вызывающему изменить глобальную переменную. Это не очень хорошая идея, чтобы манипулировать глобальной переменной в функции, как показано ниже:
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()