• 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时候的值

  • 相关阅读:
    CF219D
    HDU 4259 Double Dealing 数学题
    HDU1599 find the mincost route 最小环
    HDU3592 World Exhibition 排队判断3种情况
    POJ3694 Network 加边查询剩余桥的个数
    Flex 如何获得Tree 拖动节点的起始位置
    wcf webconfig配置
    学JS面向对象 以及里面的继承
    sqlserver 几种查询耗时
    ubuntu更改文件夹属性
  • 原文地址:https://www.cnblogs.com/max88888888/p/11128599.html
Copyright © 2020-2023  润新知