python 3:unboundlocalerror:赋值前引用的局部变量

pw9qyyiw  于 2021-09-29  发布在  Java
关注(0)|答案(5)|浏览(408)

此问题已在此处找到答案

首次使用后重新分配局部变量时出现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()

我怎样才能解决这个问题?谢谢你的帮助!

pgx2nnw8

pgx2nnw81#

您可以通过传递参数而不是依赖全局参数来解决此问题

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)
kgsdhlau

kgsdhlau2#

这是因为,即使 Var1 存在时,您还在名称上使用赋值语句 Var1 函数内部( Var1 -= 1 在底线)。自然,这会在函数的作用域内创建一个名为 Var1 (老实说,一个 -=+= 将只更新(重新分配)现有变量,但由于未知原因(在本上下文中可能是一致性),python将其视为分配。python解释器在模块加载时看到这一点,并决定(正确地说)全局范围的 Var1 不应在局部范围内使用,这会导致在局部赋值之前尝试引用变量时出现问题。
python开发人员通常不赞成在必要的情况下使用全局变量,因为这会导致代码混乱和问题。但是,如果您想使用它们来完成代码的含义,您可以简单地添加:

global Var1, Var2

在函数的顶部。这将告诉python您不打算定义 Var1Var2 函数的局部范围内的变量。python解释器在模块加载时看到这一点,并决定(正确地说)在全局范围内查找对上述变量的任何引用。

一些资源

python网站对这个常见问题有很好的解释。
Python3提供了一个相关的 nonlocal 声明-也请检查一下。

zi8p0yeb

zi8p0yeb3#

如果在函数中设置变量的值,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()
xiozqbni

xiozqbni4#

我不喜欢这种行为,但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]] ,并决定它也是 f(3) . 你可以加一个 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]] 现在更改全局变量 f3 ,因此它不再是一个函数。
幸运的是,在python3中将括号添加到 print .

dphi5xsq

dphi5xsq5#

为什么不直接返回计算值,让调用者修改全局变量呢。在函数中操纵全局变量不是一个好主意,如下所示:

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()

或者甚至制作全局变量的本地副本并使用它们,然后返回调用者可以适当分配的结果

def function():
v1, v2 = Var1, Var2

# calculate using the local variables v1 & v2

return v1 - 1

Var1 = function()

相关问题