Python 3:UnboundLocalError:赋值之前引用的局部variables

以下代码给出错误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() 

我该如何解决这个问题? 感谢您的帮助!

您可以通过传递参数而不是依靠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) 

这是因为,即使存在Var1 ,也会在函数内部名称Var1上使用赋值语句(最底行的Var1 -= 1 )。 当然,这会在函数的作用域Var1内创build一个variables(实际上, -=+=只会更新(重新分配)一个已经存在的variables,但是由于未知的原因(可能在这个上下文中的一致性),Python认为它是一个赋值) 。 Python解释器在模块加载时看到了这一点,并决定(正确如此)全局作用域的Var1不应该在本地作用域内使用,这会导致在尝试在本地分配variables之前引用该variables时出现问题。

Python开发人员通常不赞成使用全局variables,因为这会导致令人困惑和有问题的代码。 但是,如果您想要使用它们来完成代码隐含的function,则可以简单地添加:

 global Var1, Var2 

在你的函数的顶部。 这将告诉Python你不打算在函数的本地范围内定义一个Var1Var2variables。 Python解释器在模块加载时看到这个,并决定(正确地)查找对全局作用域中上述variables的任何引用。

如果你在函数中设置了一个variables的值,python就会理解它是用这个名字创build一个局部variables的。 这个局部variables掩盖了全局variables。

在你的情况下, Var1被认为是一个局部variables,它被使用之前被设置,从而出现错误。

为了解决这个问题,你可以明确的说,把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 assignment 

Python认为f[f for f in [1, 2, 3]]用作局部variables,并且决定它也是f(3)的局部variables。 你可以添加一个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]]现在将全局variablesf更改为3 ,所以它不再是函数。

幸运的是,在添加圆括号print后,它在Python3中工作正常。

为什么不简单地返回你的计算值,让调用者修改全局variables。 在函数中操作全局variables不是一个好主意,如下所示:

 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() 

甚至可以制作全局variables的本地副本并与它们一起工作,并返callback用者可以适当分配的结果

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