Python3:UnboundLocalError:赋值前引用的局部变量
以下代码给出了错误Python3:UnboundLocalError:赋值前引用的局部变量,python,function,python-3.x,Python,Function,Python 3.x,以下代码给出了错误UnboundLocalError:赋值前引用的局部变量“Var1”: 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
UnboundLocalError:赋值前引用的局部变量“Var1”:
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()
Var1=1
Var2=0
def函数():
如果Var2==0且Var1>0:
打印(“结果一”)
elif Var2==1且Var1>0:
打印(“结果二”)
elif Var1<1:
打印(“结果三”)
Var1=-1
函数()
我怎样才能解决这个问题?谢谢你的帮助 您可以通过传递参数而不是依赖全局参数来解决此问题
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)
def函数(Var1、Var2):
如果Var2==0且Var1>0:
打印(“结果一”)
elif Var2==1且Var1>0:
打印(“结果二”)
elif Var1<1:
打印(“结果三”)
返回Var1-1
功能(1,1)
这是因为,即使存在Var1
,您也在函数内部的名称Var1
上使用赋值语句(Var1-=1
)。当然,这会在函数的作用域内创建一个名为Var1
的变量(老实说,-=
或+=
只会更新(重新分配)现有变量,但由于未知的原因(在此上下文中可能是一致的),Python将其视为赋值)。Python解释器在模块加载时看到了这一点,并决定(正确地说)不应在局部范围内使用全局范围的Var1
,这会导致在本地分配变量之前尝试引用变量时出现问题
Python开发人员通常不赞成在必要的情况下使用全局变量,因为这会导致代码混乱和问题。但是,如果您想使用它们来完成代码的含义,您可以简单地添加:
global Var1, Var2
在函数的顶部。这将告诉Python您不打算在函数的局部范围内定义Var1
或Var2
变量。Python解释器在模块加载时看到这一点,并决定(正确地说)在全局范围内查找对上述变量的任何引用
一些资源
- Python网站对这个常见问题有一个解决方案
- Python3提供了一个相关的语句——也请检查它
如果在函数中设置变量的值,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()
Var1=1
Var2=0
def函数():
全球Var1
如果Var2==0且Var1>0:
打印(“结果一”)
elif Var2==1且Var1>0:
打印(“结果二”)
elif Var1<1:
打印(“结果三”)
Var1=-1
函数()
为什么不直接返回计算值,让调用者修改全局变量呢。在函数中操纵全局变量不是一个好主意,如下所示:
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()
我不喜欢这种行为,但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
它确实有效;然而,f在最后变成了3。。。也就是说,print[f for f in[1,2,3]
现在将全局变量f
更改为3
,因此它不再是一个函数
幸运的是,在为print
添加括号后,它在Python3中工作得很好。请注意,如果使用dic={'Var1':1,'Var2':0}
并通过字典访问Var1和Var2,它将工作。除此之外,Var1=-1
解析为Var1=-1
,notVar1-=1
How comes不给出错误UnboundLocalError:赋值前引用的局部变量“Var2”?即使将if Var2==0和Var1>0:if Var2==0:@chikitin更改为if Var2:@chikitin,它也不会为Var2给出错误,因为在函数中没有为Var2分配任何where值,因此它默认考虑Var2的全局值。但是,由于您提到了Var1=-1,python将其解释为Var1=-1,因此它认为Var1被分配了一个局部值,因此Var1变成了一个局部变量&一个全局变量,python认为是独立的。由于Var1的这个赋值是在同一个函数中使用Var1之后进行的,所以我们在赋值错误之前得到这个引用。希望这能给你一些帮助clarity@chikitin以防万一,如果您想弹出Var2的错误,只是为了检查和澄清您的疑问,只需在Var1=-1语句下面为Var2分配一些值,然后您也会得到Var2的错误。@user7344209确实如此。理想情况下,答案应该解释所示实际示例中发生的情况以及如何解决,而不是建议一种完全不同的方法。“自然”,我觉得这并不自然。@dumbledad我的意思是“自然”,即+=
是赋值运算符(iadd
,代表“就地添加”)用可行的解决方案很好地解释了这种现象的原因是什么?我想研究一下其他语言是否也有类似的功能,但我不确定谷歌应该做什么。我认为这个简单的示例代码正好说明了这个问题。对于这种情况,具体的解决方案还不够明确。
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
def f(x):
return x
def main():
global f
print f(3)
if (True):
print [f for f in [1, 2, 3]]
main()