在python中我们可以在一个函数中再定义一个函数,而内部的函数可以使用外部的局部变量。如下面的代码:
01 def test():
02 a=1
03 def test1():
04 print a
05 a=2
06 test1()
07 a=3
08 test1()
09
10 test()
输出结果是
2
3
这是一个很方便的特性,但是需要注意的是,在内部的函数中无法修改外部的局部变量。
例如下面的代码,就会报错:
01 def test():
02 a=1
03 def test1():
04 a+=2
05 print a
06 a=2
07 test1()
08 a=3
09 test1()
10
11 test()
UnboundLocalError: local variable ‘a’ referenced before assignment
在python的FAQs中提到了这件事,如果一个变量在函数中被赋值,那么就被视为局部变量,也就是test1里面的a此时被认为是test1自己的局部变量,而我们没有给a赋值就使用了a,于是出现上面的异常信息。这也就是我前面说“无法修改”的原因,并不是不允许修改,而是无法使用到这个外部的变量(test的a是外部变量,test1中的a被当成了局部变量,在test1中我们看不见test中的a)。
在python 3.0之后,我们可以通过给一个变量加nonlocal标识符来告诉解释器,不要把这个变量当成函数内部的局部变量,从而可以修改外部变量。这也更证明了前面的无法修改的观点。3.0代码如下:
01 def test():
02 a=1
03 def test1():
04 nonlocal a
05 a+=2
06 print(a)
07 a=2
08 test1()
09 a=3
10 test1()
11
12 test()