zoukankan      html  css  js  c++  java
  • python里的闭包

    ”闭包是由函数及其相关的引用环境组成的实体“,简单点说,就是在一个外函数内嵌套定义了一个内函数,并且内函数中引用了外函数中的局部变量,并且外层函数将内函数作为返回值返回给调用者,那么return的值就是一个闭包

    例:

    def outer(x):
        def inner():
            nonlocal x
            x += 1
            return x
        return inner

    上面是一个嵌套函数,当调用outer的时候就会得到函数返回的一个闭包,这个闭包就包含了函数inner() 以及函数内引用的外部变量X,闭包也是一个对象,里面的变量相当于一个对象的内部成员

    在闭包调用时例如执行以下代码

    a = outer(1)
    b = outer(2)
    
    print(a(), b())
    print(a(), b())

    得到的结果将是:

    2 3
    3 4

    原因很简单,a是一个闭包对象, b也是一个闭包对象,a b只是同一“类型”的闭包对象,他们之间是没有关系的,当a调用的时候,a闭包的x成员值加1,而对b闭包的x成员没有影响,b调用的时候也只是对b内的x成员加1,而在第二次调用a闭包的时候,由于前一次调用的时候已经加1,所以再次调用又加1,b同理

    另一种情况

    def outer():
        fs = []
        for i in range(3):
            def inner():
                return i
            fs.append(inner)
        return fs
    
    a, b, c = outer()
    print(a(), b(), c())

    预想的结果是 0, 1, 2, 而实际的到的结果是2, 2, 2

    原因也很简单,闭包是在外函数return的时候产生,当外函数return的时候发现返回值满足闭包的情况,那么就会将闭所需要的外函数的局部变量绑定到闭包上,因为在return的时候才给产生闭包,所以闭包里面的引用值就是return时候该变量的值,而不是append时候的值

  • 相关阅读:
    详解REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR
    HTTP Header 详解
    搜索引擎爬虫蜘蛛的useragent
    PHP防抓取数据curl 解决方法
    用curl抓取网站数据,仿造IP、防屏蔽终极强悍解决方式
    windows下 composer常见问题及处理
    Composer命令详解
    SSM框架之RestFul示例
    关于SpringMVC返回数据带斜杠字符串问题之解决方案
    js之radio应用实例
  • 原文地址:https://www.cnblogs.com/max88888888/p/11128599.html
Copyright © 2011-2022 走看看