Python 3:UnboundLocalError:赋值前引用的局部变量

新手上路,请多包涵

以下代码给出了错误 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()

我怎样才能解决这个问题?

原文由 Eden Crow 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

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

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)

原文由 Jakob Bowyer 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是因为,即使 Var1 存在,您也在函数内部的名称 Var1 上使用赋值语句( Var1 -= 1 at the bottom line-) .自然地,这会在函数范围内创建一个名为 Var1 的变量(如实说,一个 -=+= 将仅更新(重新分配)现有变量的原因未知(在这种情况下可能是一致的),Python 将其视为一项任务)。 Python 解释器在模块加载时看到这一点,并决定(正确地)全局范围的 Var1 不应在局部范围内使用,这会导致在您尝试引用变量之前出现问题本地分配的。

Python 开发人员通常不赞成在不必要的情况下使用全局变量,因为它会导致代码混乱和有问题。但是,如果您想使用它们来完成您的代码所暗示的内容,您只需 在函数的顶部 添加:

 global Var1, Var2

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

一些资源

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

原文由 orokusaki 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题