此问题已在此处有答案:
UnboundLocalError trying to use a variable (supposed to be global) that is (re)assigned (even after first use)(14个回答)
Using global variables in a function(25个答案)
7年前关闭。
下面的代码给出错误UnboundLocalError: local variable 'Var1' referenced before assignment
:
Var1 = 1
Var2 = 0
def function():
if Var2 == 0 and Var1 > 0:
print("Result 1")
elif Var2 == 1 and Var1 > 0:
print("Result 2")
elif Var1 < 1:
print("Result 3")
Var1 -= 1
function()
我该怎么解决这个问题?
5条答案
按热度按时间0s7z1bwu1#
这是因为,即使
Var1
存在,您也在函数内部对名称Var1
使用赋值语句(Var1 -= 1
在底部行)。自然地,这在函数的作用域内创建了一个名为Var1
的变量(实际上,-=
或+=
只会更新(重新分配)现有变量,但由于未知原因(可能在此上下文中是一致的),Python将其视为赋值)。Python解释器在模块加载时看到这一点,并决定(正确地)全局作用域的Var1
不应该在局部作用域中使用,这会导致在变量被局部赋值之前尝试引用变量时出现问题。Python开发人员通常不赞成在不必要的情况下使用全局变量,因为它会导致代码混乱和有问题。然而,如果你想使用它们来完成你的代码所暗示的,你可以简单地在函数的顶部添加,****:
这将告诉Python,你不打算在函数的局部作用域中定义
Var1
或Var2
变量。Python解释器在模块加载时看到这一点,并决定(正确地)在全局范围内查找对上述变量的任何引用。部分资源
nonlocal
语句--也可以看看。vhipe2zx2#
如果你在函数内部设置了一个变量的值,python会把它理解为创建了一个同名的局部变量。这个局部变量屏蔽了全局变量。
在你的例子中,
Var1
被认为是一个局部变量,并且在设置之前使用它,因此错误。为了解决这个问题,你可以通过在你的函数中放入
global Var1
来明确地说它是一个全局变量。qyuhtwio3#
您可以通过传递参数而不是依赖于Globals来解决这个问题
pjngdqdw4#
我不喜欢这种行为,但这就是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
,因此它不再是一个函数。幸运的是,在
print
中添加括号后,它在Python3中运行良好。krcsximq5#
为什么不简单地返回计算值,让调用者修改全局变量。在函数中操作全局变量不是一个好主意,如下所示:
或者甚至创建全局变量的本地副本并使用它们并返回调用者可以适当分配的结果