一尘不染

Python-首次使用后重新分配局部变量时出现unbundLocalERROR

python

以下代码可在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)的注释时,会得到一个unbundlocalerror:"c"未在行(A)处分配。a和b的值打印正确。这让我完全困惑,原因有二:

  1. 为什么由于行(B)的后面的语句而在行(A)抛出运行时错误?
  2. 为什么在按预期方式打印变量a并引发错误?bc

我能想到的唯一解释是,局部变量c是由赋值c+=1创建的,它甚至在创建局部变量之前就已经取代了“全局”变量c。当然,一个变量在它存在之前“偷走”范围是没有意义的。


阅读 667

收藏
2020-02-05

共1个答案

一尘不染

Python对函数中的变量的处理方式不同,这取决于你是从函数内部还是外部为变量赋值。如果在函数中分配了变量,则默认情况下将其视为局部变量。因此,当你取消对行的注释时,你试图在为其赋值之前引用局部变量c。
如果你希望变量c引用在函数之前分配的全局c=3,请输入

global c

作为函数的第一行。

至于python 3,现在有

nonlocal c

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

2020-02-05