美文网首页Python
Python中的闭包

Python中的闭包

作者: vapa | 来源:发表于2019-07-16 21:46 被阅读5次

    闭包:高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
    先来看这样一个函数:

    # 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关键字只能用于嵌套函数中,并且外层函数中定义了相应的局部变量,否则会发生错误(见第一)。

    相关文章

      网友评论

        本文标题:Python中的闭包

        本文链接:https://www.haomeiwen.com/subject/ywdxlctx.html