def fnx(x):
def fny(y):
return x*y
return fny
i=fnx(3)
print(i)
输出:<function fnx.<locals>.fny at 0x000002B19A2E77B8>
i=fnx(3),fnx(3)的返回值就是一个函数fny,也就是i指向了内部函数fny
上面的代码特征:在一个外部函数中定义了一个内函数,内部函数里运用了外部函数的临时变量,并且外函数的返回值是内函数的引用。这是一个闭包。
当函数执行结束后,会把自己的函数内定义的变量都释放还给内存,之后变量会被请款,但如果是闭包,外部函数执行时,自己的变量会在将来的内部函数中用到,自己在结束的时候,返回内函数的同时,会把外函数的临时变量送给内函数绑定在一起。所以外函数已经结束了,调用内函数的时候仍然能够使用外函数的临时变量。
def fnx(x):
def fny(y):
return x*y
return fny
i=fnx(3)
print(i(4))
输出:12
如果想要在内部函数中改外部函数的值,可以将外部函数的临时变量变成可修改变量
def fnp():
p=[2]
def fnq():
p[0]*=p[0]
return p[0]
return fnq
print(fnp()())
输出:4
还可以使用nonlocal
def fnp():
p=3
def fnq():
nonlocal p
p*=p
return p
return fnq
print(fnp()())
输出:9