def f():
a = 1
def f1():
a = a + 1
return a
return f1
执行是会报错: UnboundLocalError
改一下:
def f():
a = 1
def f1():
b = a + 1
return b
return f1
可以正确运行结果为: 2
原因分析如下:
a = a + 1 这是个赋值表达式,在python中变量是不需要提取声明的,一个变量第一次赋值就是声明了这个变量。a = a + 1 这个表达式的意思是声明一个局部变量a并将它 + 1后赋值给它自己,而此时a 还没有初始化(没有被赋值),所以会出现报错 UnboundLocalError: local variable 'a' referenced before assignment
虽然闭包中内部函数可以引用外部函数的变量,但a = a + 1 中“=”号前的a覆盖掉了外部函数f中的局部变量a=1,所以a = a + 1就会出现未定义的错误。只要外部函数f中的局部变量a 不被覆盖就可以解决问题。所以改成b = a + 1就可以正常运行。其实还可以这样改:
def f():
a = [1]
def f1():
a[0] = a[0] + 1
return a[0]
return f1
这也是可以正常运行的,因为此时的外部函数f的局部变量a 是一个可变对象