Python 闭包使用注意点

1 Python 闭包

今天,聊下 python 的闭包。在函数编程中经常用到闭包。

闭包是什么,它是怎么产生的及用来解决什么问题呢。给出字面的定义先:闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)(想想Erlang的外层函数传入一个参数a, 内层函数依旧传入一个参数b, 内层函数使用a和b, 最后返回内层函数)

结合实例代码进行解释。

在函数式编程语言中,函数是一等公民,函数可以作为另一个函数的参数或返回值可以赋给一个变量。函数可以嵌套定义,即在一个函数内部可以定义另一个函数。

  1. In [4]: def extfunc(n):

  2. ...: sum = n

  3. ...: def intfunc():

  4. ...: return sum+1

  5. ...: return intfunc

  6. ...:

  7. ...:

  8. In [5]: extfunc(20)

  9. Out[5]: <function __main__.extfunc.<locals>.intfunc()>

  10. In [6]: f = extfunc(20)

  11. In [7]: f()

  12. Out[7]: 21

我们注意到一个问题:内嵌函数 intfunc中引用到外层函数中的局部变量sum,当我们调用分别由不同的参数调用 extfunc函数时,返回的函数是隔离的吗 ?

  1. In [9]: f2 = extfunc(100)

  2. In [10]: f2()

  3. Out[10]: 101

是隔离的。也就是说,每次调用 extfunc 函数后都将生成并保存一个新的局部变量 sum,其实这里 extfunc 函数返回的就是闭包

按照我们熟悉的命令式语言的规则,extfunc 函数只是返回了内嵌函数 intfunc 的地址,在执行 intfunc 函数时将会由于在其作用域内找不到 sum变量而出错

而在函数式语言中,当内嵌函数体内引用到体外的变量时,将会把定义时涉及到的引用环境和函数体打包成一个整体(闭包)返回

2 闭包注意事项

闭包中是不能修改外部作用域的局部变量的

演示代码

  1. In [17]: def foo():

  2. ...: m = 0

  3. ...: def intfoo():

  4. ...: m = 1

  5. ...: print(m)

  6. ...: print(m)

  7. ...: intfoo()

  8. ...: print(m) #不会改变

  9. ...:

  10. In [18]: foo()

  11. 0

  12. 1

  13. 0

更多闭包使用问题,欢迎留言。

注意事项

01

对Python开发技术感兴趣的同学,欢迎加下方的交流群一起学习,相互讨论。

02

如果在学习中遇到问题有不明白的地方,推荐加小编微信:Pythonsusu

有视频教程 ,直播课程 ,等学习资料,期待你的加入

猜你喜欢

转载自blog.csdn.net/weixin_44811417/article/details/89673419
今日推荐