Python 闭包使用注意点

作者: 编程鸭 | 来源:发表于2019-04-29 14:25 被阅读5次

    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有任何问题(学习方法,学习效率,如何就业),可以随时来咨询我!

    相关文章

      网友评论

        本文标题:Python 闭包使用注意点

        本文链接:https://www.haomeiwen.com/subject/ruyynqtx.html