![fff6d0193f0cddaf70912b605c4ac5b7.png](https://i-blog.csdnimg.cn/blog_migrate/58440a5ac276d415a1157e0cef89fd14.png)
点击上方蓝字关注我们
![fff6d0193f0cddaf70912b605c4ac5b7.png](https://i-blog.csdnimg.cn/blog_migrate/58440a5ac276d415a1157e0cef89fd14.png)
Py3的闭包类比其他语言(如javascript)并无区别,就是函数式编程,闭包的形成通常包含以下三个条件:
![c45e366b1a7a2370d3ec9a7a22744dd0.gif](https://i-blog.csdnimg.cn/blog_migrate/5c3adca463547567dfc6b68399c39450.gif)
1.函数内部嵌套了一个函数
2.内部函数可以访问外部函数作用域内的局部变量
3函数返回内部函数的引用
![c45e366b1a7a2370d3ec9a7a22744dd0.gif](https://i-blog.csdnimg.cn/blog_migrate/5c3adca463547567dfc6b68399c39450.gif)
![fff6d0193f0cddaf70912b605c4ac5b7.png](https://i-blog.csdnimg.cn/blog_migrate/58440a5ac276d415a1157e0cef89fd14.png)
如图,首次调用外部函数line(1,2),相当于完成了初始化操作,将结果赋值给f1;外部函数返回的是内部函数的引用;再次调用f1相当于调用了内部函数,内部函数可以访问外部函数作用域内的变量。
![c45e366b1a7a2370d3ec9a7a22744dd0.gif](https://i-blog.csdnimg.cn/blog_migrate/5c3adca463547567dfc6b68399c39450.gif)
闭包比普通函数多了一个 __closure__属性,通过打印print(f1.__closure__)可以看到该属性绑定了外部函数的参数,返回一个元组。当闭包调用时,自然就可以找到外部函数的参数了。
![c45e366b1a7a2370d3ec9a7a22744dd0.gif](https://i-blog.csdnimg.cn/blog_migrate/5c3adca463547567dfc6b68399c39450.gif)
在闭包中如果要访问并修改外部函数内的局部变量,需要加nonlocal关键字声明,否则会报错:UnboundLocalError: local variable 'x' referenced before assignment。
nonlocal类似global都是用来声明变量作用域,nonlocal表示非本地变量,用来引用内部函数作用域外,外部函数作用域内的,非全局变量。
更多精彩
![140f7fe911783058959465f4692dadb8.png](https://i-blog.csdnimg.cn/blog_migrate/ae61a395fcfd30351591239a8ae78d9e.jpeg)
扫码关注