python - 首次使用后重新分配时,局部变量上出现UnboundLocalError

标签 python variables scope

以下代码可在Python 2.5和3.0中正常工作:

a, b, c = (1, 2, 3)

print(a, b, c)

def test():
    print(a)
    print(b)
    print(c)    # (A)
    #c+=1       # (B)
test()

但是,当我取消注释(B)行时,我在(A)行获得了UnboundLocalError: 'c' not assigned。正确打印了ab的值。这使我完全困惑,原因有两个:
  • 为什么稍后在(B)行上声明,在(A)行上引发运行时错误?
  • 为什么按预期方式打印变量ab,而c引发错误?

  • 我能提出的唯一解释是,分配c创建了本地变量c+=1,甚至在创建本地变量之前,它就比“全局”变量c优先。当然,在变量存在之前“窃取”范围是没有意义的。

    有人可以解释这种现象吗?

    最佳答案

    Python对函数中的变量的处理方式有所不同,具体取决于您是从函数内部还是外部为其分配值。如果在函数内分配了变量,则默认情况下会将其视为局部变量。因此,当取消注释该行时,您将尝试在分配任何值之前引用局部变量c

    如果希望变量c引用该函数之前分配的全局c = 3,请输入

    global c
    

    作为函数的第一行。

    至于python 3,现在有
    nonlocal c
    

    您可以用来引用最近的包含c变量的封闭函数范围。

    关于python - 首次使用后重新分配时,局部变量上出现UnboundLocalError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64554600/

    相关文章:

    jsf - 在 Primefaces JSF2.x 中使用请求范围的托管 bean

    javascript - 使用python或js将带有dynamic-css的html下载为pdf

    python - 在 macOS Sierra 上使用 git-review 的 RequestsDependencyWarning

    bash - 变量值用单引号引起来

    java - 在java中的变量名末尾 append 一个数字

    javascript - 如果没有选择任何选项,则禁用按钮angularJS

    C++ 变量丢失

    python - python中的列表理解,如何?

    python - 如何在 python 中实现(更复杂的)R pyr 链?

    Javascript 使用变量通过按钮创建 url