• 闭包


    局部变量在函数执行完成后就被销毁了。那么如果在line函数中使用了line_conf的变量,当line_conf函数执行完成后,在全局环境中的line函数还能使用line_conf中的变量吗?

    def line_conf():
      b = 15
      def line(x):
        return 2*x + b
      return line
    
    b = 5
    my_line = line_conf()
    print(my_line(5))

    在上面的代码中,line函数使用了父函数中声明的变量b, 此时变量b为line的环境变量

    当line函数作为line_conf函数的返回值时( return line), 变量b的取值已经和line函数绑定在一起,此时父函数line_conf已经和变量b没关系了,变量b即使再变化,也不会影响到line函数的计算结果

    这种情况下,我们就说line函数和它的环境变量b构成了一个闭包,闭包时一个独立的运行环境,不受外部环境的影响。 上面的代码输出结果时25, 而不是15

    查看闭包中自由变量b的值

    >>> myline.__closure__[0].cell_contents
    15

    查看myline对象实例中的自由变量,局部变量

    >>> myline.__code__.co_freevars
    ('b',)
    >>> myline.__code__.co_varnames
    ('x',)
  • 相关阅读:
    如何用vue实现树形菜单?
    spring+springMVC,声明式事务失效,原因以及解决办法
    java提高同步锁的几点建议
    java自定义before和after
    java线程池
    jdk并发工具包之锁
    ReentrentLock重入锁
    java守护线程
    ReentrantLock
    java多线程基础
  • 原文地址:https://www.cnblogs.com/regit/p/12697790.html
Copyright © 2020-2023  润新知