Py3的闭包类比其他语言(如javascript)并无区别,就是函数式编程,闭包的形成通常包含以下三个条件:

【py3】闭包_java

1.函数内部嵌套了一个函数

2.内部函数可以访问外部函数作用域内的局部变量

3函数返回内部函数的引用

【py3】闭包_java_02

【py3】闭包_java_03

【py3】闭包_java_04

如图,首次调用外部函数line(1,2),相当于完成了初始化操作,将结果赋值给f1;外部函数返回的是内部函数的引用;再次调用f1相当于调用了内部函数,内部函数可以访问外部函数作用域内的变量。

【py3】闭包_java_05

闭包比普通函数多了一个 __closure__属性,通过打印print(f1.__closure__)可以看到该属性绑定了外部函数的参数,返回一个元组。当闭包调用时,自然就可以找到外部函数的参数了。

【py3】闭包_java_06

在闭包中如果要访问并修改外部函数内的局部变量,需要加nonlocal关键字声明,否则会报错:UnboundLocalError: local variable 'x' referenced before assignment。

nonlocal类似global都是用来声明变量作用域,nonlocal表示非本地变量,用来引用内部函数作用域外,外部函数作用域内的,非全局变量。