1 Python 闭包
今天,聊下 python 的闭包。在函数编程中经常用到闭包。
闭包是什么,它是怎么产生的及用来解决什么问题呢。给出字面的定义先:闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)(想想Erlang的外层函数传入一个参数a, 内层函数依旧传入一个参数b, 内层函数使用a和b, 最后返回内层函数)。
结合实例代码进行解释。
在函数式编程语言中,函数是一等公民,函数可以作为另一个函数的参数或返回值,可以赋给一个变量。函数可以嵌套定义,即在一个函数内部可以定义另一个函数。
-
In [4]: def extfunc(n):
-
...: sum = n
-
...: def intfunc():
-
...: return sum+1
-
...: return intfunc
-
...:
-
...:
-
In [5]: extfunc(20)
-
Out[5]: <function __main__.extfunc.<locals>.intfunc()>
-
In [6]: f = extfunc(20)
-
In [7]: f()
-
Out[7]: 21
我们注意到一个问题:内嵌函数 intfunc中引用到外层函数中的局部变量sum,当我们调用分别由不同的参数调用 extfunc函数时,返回的函数是隔离的吗 ?
-
In [9]: f2 = extfunc(100)
-
In [10]: f2()
-
Out[10]: 101
是隔离的。也就是说,每次调用 extfunc 函数后都将生成并保存一个新的局部变量 sum,其实这里 extfunc 函数返回的就是闭包。
按照我们熟悉的命令式语言的规则,extfunc 函数只是返回了内嵌函数 intfunc 的地址,在执行 intfunc 函数时将会由于在其作用域内找不到 sum变量而出错。
而在函数式语言中,当内嵌函数体内引用到体外的变量时,将会把定义时涉及到的引用环境和函数体打包成一个整体(闭包)返回。
2 闭包注意事项
闭包中是不能修改外部作用域的局部变量的
演示代码
-
In [17]: def foo():
-
...: m = 0
-
...: def intfoo():
-
...: m = 1
-
...: print(m)
-
...: print(m)
-
...: intfoo()
-
...: print(m) #不会改变
-
...:
-
In [18]: foo()
-
0
-
1
-
0
更多闭包使用问题,欢迎留言。
注意事项
01
对Python开发技术感兴趣的同学,欢迎加下方的交流群一起学习,相互讨论。
02
如果在学习中遇到问题有不明白的地方,推荐加小编微信:Pythonsusu
有视频教程 ,直播课程 ,等学习资料,期待你的加入