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
python交流学习扣扣群:975188894,多多交流问题,互帮互助,群里有不错的学习教程和开发工具。学习python有任何问题(学习方法,学习效率,如何就业),可以随时来咨询我!
网友评论