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
,not
Var1-=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()