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

posted on 2019-07-03 19:47  lazzzy  阅读(158)  评论(0编辑  收藏  举报

导航