zoukankan      html  css  js  c++  java
  • 闭包!!!

    闭包的定义:嵌套函数,外部函数的变量被内部函数调用

    先走一段代码:

    def func():
        a = 1
        def new_func():
            print(a)
        return new_func
    new = func()
    print(new)
    new()
    
    #打印:
    <function func.<locals>.new_func at 0x000001DC5B9EB948>
    1

    解读起来就是:

    当外部函数func调用时,外部函数的变量a并没有在内部函数调用,因为内部函数并没有被调动起来;
    而外部函数被调用执行时,a已经在存放局部名称空间的内存中存放起来,

    走到内部函数的函数名时,函数名同样和a一起被存放在局部名称空间,指向的内存地址存放的是内部函数的函数名,
    这个时候我们直接在外部函数返回内部函数的内存地址,即变量名,再以一个新的对象接收,

    那么我们每次使用新的对象名加上()就可以直接将内部函数的内存地址存放的a调用起来,而不用每次都需要调用外部函数,因为每一次调用会使得内存会一直新建、释放内存。
    闭包的好处就是保存函数的状态信息,使函数的局部变量信息依然可以保存下来
    这是整个闭包执行完后的流程图

    我们再看一下正常的函数调用是什么样的:

    def func():
        a = 1
        def new_func():
            print(a)
        new_func()
    func()
    
    
    #打印
    1

    由于在全局名称空间当中,没有对象指向new—func的内存地址,所以无法在全局作用域下直接调用它取得a,这样每次需要获取它时,都需要调用外部函数,使得每一次调用会使得内存会一直新建、释放内存。

     
  • 相关阅读:
    C#全角半角转换输出解决方法
    screen命令
    Parrot Linux国内源
    screen命令在freebsd安装和使用
    sysbench0.5 在 centos7下安装 (mysql-community-server)
    Mysql中文乱码问题完美解决方案
    PHP返回数据被nginx截断问题的解决方法
    yii2笔记:asset压缩js,css文件
    Yii2笔记:activerecord和activecontroller
    yii2笔记: 模块(module)
  • 原文地址:https://www.cnblogs.com/aizhinong/p/11355463.html
Copyright © 2011-2022 走看看