小编典典

首次使用后重新分配时局部变量上的 UnboundLocalError

all

以下代码在 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()

但是,当我取消注释 line (B) 时,我得到一个UnboundLocalError: 'c' not assignedat line
(A)a和的值b打印正确。这让我完全困惑有两个原因:

  1. 为什么在 (A)行出现运行时错误,因为 (B) 行后面有一个语句?

  2. 为什么变量a并按b预期打印,而c引发错误?

我能想到的唯一解释是 局部 变量c是由 assignment
创建的c+=1,它甚至在创建局部变量之前就优先于“全局”变量c。当然,在变量存在之前“窃取”范围是没有意义的。

有人可以解释这种行为吗?


阅读 159

收藏
2022-05-20

共1个答案

小编典典

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

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

global c

作为函数的第一行。

至于python 3,现在有

nonlocal c

您可以使用它来引用最近的具有c变量的封闭函数范围。

2022-05-20