在python中,当您将内部定义的函数传递给其他函数时,它如何保留变量?

use*_*2pi 9 python function-pointers function

例如,为什么这有效?

def func1(func1var):
    def innerfunc(innerfuncvar):
        if func1var == 1:
             print innerfuncvar
        else:
             print 5
    func2(innerfunc)


def func2(function):
     function(9)
Run Code Online (Sandbox Code Playgroud)

innerfunc被调用时func2,它如何知道func1var?的值?

agf*_*agf 7

你已经创建了一个闭包.基本上,从内部功能的角度来看,这样想:

func1var = whatever

def func2(function):
    function(9)

def innerfunc(innerfuncvar):
    if func1var = 1:
         print innerfuncvar
    else:
         print 5

func2(innerfunc)
Run Code Online (Sandbox Code Playgroud)

它不关心func1var是在外部还是全局范围内 - 它只是在每个范围内向外查找它,从它自己的本地范围开始.就像从模块中的类或函数内部引用模块全局变量一样.


kin*_*all 6

Python实际上已经花了一些时间为你做这件事.在函数内定义函数时,可以使用内部函数中外部函数的变量.对于任何深度的嵌套都是如此(也就是说,你可以在函数内部的函数内部有一个函数...到任何深度......并且最里面的函数可以使用来自任何封闭函数的变量).如果存在冲突的名称,则使用具有所请求名称的最内层变量.

更重要的是,Python实际上从外部函数捕获您使用的任何变量,并将它们存储在内部函数中,这称为闭包.因此,您不仅可以像往常一样将函数传递给另一个函数,而且可以从函数返回函数,并且在定义函数时从外部函数中使用的变量仍然可以从函数中访问返回函数,即使外部函数不再运行.这是一个相当高级的功能,但它允许您执行以下操作:

def make_adder(increment):
    def adder(number):
        return number + increment
    adder.__name__ = "adder(%s)" % increment
    return adder
Run Code Online (Sandbox Code Playgroud)

此函数是一个函数,它创建一个向其添加指定值的函数.例如:

add1 = make_adder(1)
add5 = make_adder(5)

print add1(10)   # 11
print add5(10)   # 15
Run Code Online (Sandbox Code Playgroud)

在这种情况下,传递给的值将make_adder被捕获并存储在返回的函数中.这允许您创建一组函数,为其参数添加任意数字.这是一个微不足道的例子,在现实生活中实际上并不是非常有用,但可以用来说明这个特征.