谁能解释一下 Python 中函数的关闭?

Can anybody explain about the closure of function in Python?

Python

任何人都可以帮助我理解这段代码,我是 Python 的新手,这个功能是如何工作的?

    def makeInc(x):
        def inc(y):

            return y + x
        return inc
    incOne = makeInc(1)
    incFive = makeInc(5)
    print(incOne(5)) # returns 6
    print(incFive(5)) # returns 10

这里发生的事情是 makeInc() returns 指向 inc() 的特定实现的函数句柄。因此,调用 makeInc(5)inc(y) 中的 x “替换”为 5 和 returns 该函数的可调用句柄。此句柄保存在 incFive 中。您现在可以调用定义的函数 (inc(y))。由于您之前设置了 x=5,因此结果将是 y+5.

高阶函数


makeInc 这样的函数反过来 return 另一个函数被称为 higher order functions。通常,已知函数接受数据作为输入,return 数据作为输出。使用高阶函数,函数而不是数据,return 代码作为输出或接受代码作为输入。这段代码被包装到一个函数中。在 Python 中,函数首先是 class 公民,这意味着函数就像数据一样可以传递。例如:

myvariable = print

注意,我如何将 print 分配给 myvariable 以及我如何在 print 之后删除括号 没有括号的函数称为函数对象。这意味着 myvariable 现在只是 print 的另一个名称:

print("Hello World!")
myvariable("Hello World!")

以上两个语句做的事情完全一样。可以分配给变量的内容也可以从函数 returned:

def myfunction():
    return print


myfunction()("Hello World!");

现在让我们看看你的例子:

def makeInc(x):
    def inc(y):

        return y + x
    return inc

makeInc 是一个接受名为 x 的参数的函数。然后它定义了另一个名为 inc 的嵌套内部函数,它接受一个名为 y 的参数。嵌套函数的特点是它们也可以访问封闭函数的变量。在这里,inc 是内部函数,但它可以访问 x,这是封闭的外部作用域的一个变量。 最后一条语句 return inc return 是 makeInc 调用者的内部函数。 makeInc 本质上是在根据接收到的参数创建自定义函数。 例如:

x = makeInc(10)

makeInc 将首先接受 10,然后 return 接受参数 y 的函数,并将 y 递增 10。 这里,x 是一个接受任何参数 y 然后将其递增 10 的函数:

x(42) # Returns 52

nonlocal

但是,使用嵌套函数时需要注意:

def outer():
    x = 10
    def inner():
       x = 20
    inner() 
    print(x) # prints 10

在这里,您会假设最后一个 print 语句将打印 20。但不是!当您在内部函数中分配 x = 20 时,它会创建一个名为 x 的新局部变量,该变量被初始化为 20。外部 x 保持不变。要修改外x,使用nonlocal关键字:

def outer():
    x = 10
    def inner():
       nonlocal x = 20
    inner()
    print(x) # prints 20

如果你是直接读取inner()里面的x而不是赋值给它,你不需要nonlocal.