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你不打算在函数的本地范围内定义一个Var1
或Var2
variables。 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()