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