python中的内嵌函数和闭包

python中的内嵌函数和闭包

在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。

一般情况下,在我们认知当中,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失。但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束。

这就是一个闭包的例子
python中的内嵌函数和闭包
这个函数与上面的结果不同是因为上图的外函数的返回值是内函数的引用(return fun2()),下图的返回值是内函数的临时变量,运行完之后内存释放掉
python中的内嵌函数和闭包

内嵌函数的注意事项

python中的内嵌函数和闭包之所以会报错是因为x是外部变量(非全局变量),试图进行修改时外部函数的x就会被屏蔽起来

解决的方法

1、通过容器类型存储,因为容器类型不是存放在栈里的

python中的内嵌函数和闭包

2、通过nonlocal声明x不是一个局部变量,nonlocal关键字修饰变量后标识该变量是上一级的局部变量

python中的内嵌函数和闭包