理解闭包之前,先要理解函数引用。在python里面,函数名可以作为函数引用指向函数体。
def test_func():
print('say hello')
test_func() #调用函数
print(test_func) #输出函数test_func的引用
b= test_func #将函数引用复制给变量b
b()#等价于调用test_func()
闭包:内部函数引用外部函数的变量,则内部函数称为闭包,所引用的变量称为自由变量。
当调用func=outter('MALI')的时候,只有两条写在inner函数外面的输出语句被执行,inner函数并没有执行,而是作为一个函数引用返回给了变量func
到调用func(12)的时候,12传给了inner函数的参数age,并执行了inner函数。
def outter(name):
print ('my name is:' + str(name))
def inner(age):
print("----inner print----")
print('name:' + str(name))
print('age:' + str(age))
print('-----end of inner print----')
print('---end of outter print---')
return inner
func = outter('MALI')
#输出:
#my name is:MALI
#---end of outter print---
func(12)
#输出
#----inner print----
# name:MALI
# age:12
# -----end of inner print----
关键字nolocal可以用在闭包里面,修改外部函数的变量。nolocal的作用和global关键字类似,外部函数的变量如果需要修改需要在内部函数里面声明为nolocal。如下面代码,如果去掉nolocal outter_num,则下面 outter_num+=100会报错:UnboundLocalError: local variable 'outter_num' referenced before assignment。
def outter(num):
outter_num=num
def inner():
nonlocal outter_num
outter_num+=100
print(outter_num)
return inner
inner=outter(100)
inner() #输出200