此问题已在此处找到答案:
首次使用后重新分配局部变量时出现unboundlocalerror(12个答案)
5年前关闭。
下面的代码给出了错误 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条答案
按热度按时间pgx2nnw81#
您可以通过传递参数而不是依赖全局参数来解决此问题
kgsdhlau2#
这是因为,即使
Var1
存在时,您还在名称上使用赋值语句Var1
函数内部(Var1 -= 1
在底线)。自然,这会在函数的作用域内创建一个名为Var1
(老实说,一个-=
或+=
将只更新(重新分配)现有变量,但由于未知原因(在本上下文中可能是一致性),python将其视为分配。python解释器在模块加载时看到这一点,并决定(正确地说)全局范围的Var1
不应在局部范围内使用,这会导致在局部赋值之前尝试引用变量时出现问题。python开发人员通常不赞成在必要的情况下使用全局变量,因为这会导致代码混乱和问题。但是,如果您想使用它们来完成代码的含义,您可以简单地添加:
在函数的顶部。这将告诉python您不打算定义
Var1
或Var2
函数的局部范围内的变量。python解释器在模块加载时看到这一点,并决定(正确地说)在全局范围内查找对上述变量的任何引用。一些资源
python网站对这个常见问题有很好的解释。
Python3提供了一个相关的
nonlocal
声明-也请检查一下。zi8p0yeb3#
如果在函数中设置变量的值,python将其理解为创建具有该名称的局部变量。此局部变量屏蔽全局变量。
就你而言,
Var1
被视为局部变量,在设置之前使用,因此会导致错误。为了解决这个问题,你可以通过把
global Var1
在你的功能。xiozqbni4#
我不喜欢这种行为,但python就是这样工作的。其他人已经回答了这个问题,但为了完整起见,让我指出python 2有更多这样的怪癖。
python 2.7.6返回一个错误:
python看到了
f
在中用作局部变量[f for f in [1, 2, 3]]
,并决定它也是f(3)
. 你可以加一个global f
声明:它确实有效;然而,f在最后变成了3。。。就是,
print [f for f in [1, 2, 3]]
现在更改全局变量f
到3
,因此它不再是一个函数。幸运的是,在python3中将括号添加到
print
.dphi5xsq5#
为什么不直接返回计算值,让调用者修改全局变量呢。在函数中操纵全局变量不是一个好主意,如下所示:
或者甚至制作全局变量的本地副本并使用它们,然后返回调用者可以适当分配的结果