Python中的闭包
2019-07-16 本文已影响5人
vapa
闭包:高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
先来看这样一个函数:
# a=1
def foo_x(x):
# b=2
def foo_y(y):
# c=3
return x*y
return foo_y
在这个代码块中,如果执行foo_x,那么顺序流应该是先创建foo_x,接着定义foo_y,而foo_y的功能在意返回xy的值,即调用foo_y得到 xy的值,此时,再一次返回foo_y,也就是返回值x*y.
foo_y看做是一个内部功能,返回值,而返回foo_y就是返回x*y.
注意
a属于全局变量,b是一个定义在函数中的局部变量,属于局部作用域,在foo_x函数的外部并不能访问到它;但对于foo_x函数内部的foo_y函数来说,变量b属于嵌套作用域,在foo_y函数中我们是可以访问到它的。foo_y函数中的变量c属于局部作用域,在bar函数之外是无法访问的。事实上,Python查找一个变量时会按照“局部作用域”、“嵌套作用域”、“全局作用域”和“内置作用域”的顺序进行搜索.
global和nonlocal的区别
第一,两者的功能不同。global关键字修饰变量后标识该变量是全局变量,对该变量进行修改就是修改全局变量,而nonlocal关键字修饰变量后标识该变量是上一级函数中的局部变量,即嵌套作用域,如果上一级函数中不存在该局部变量,nonlocal位置会发生错误(最上层的函数使用nonlocal修饰变量必定会报错)。
第二,两者使用的范围不同。global关键字可以用在任何地方,包括最上层函数中和嵌套函数中,即使之前未定义该变量,global修饰后也可以直接使用,而nonlocal关键字只能用于嵌套函数中,并且外层函数中定义了相应的局部变量,否则会发生错误(见第一)。