为什么捕获外层函数参数的外层函数返回的内层函数在删除外层函数后还能被执行?

问题描述 投票:0回答:1
def outerfunc(x):
    def innerfunc():
         print(x)
    return innerfunc

myfunc = outerfunc(7)
myfunc()
del outerfunc
myfunc()

我正在经历闭包,并遇到了这个问题,我预计输出是一个错误。我认为这里的局部变量

x
在执行
innerfunc
之后的
del outerfunc
期间不再存在。

正确的输出是:

7
7
python closures
1个回答
0
投票

我们可以一步步跟踪您的代码库

  • outerfunc(7)
    被调用。这里,
    x
    是 7。
  • 内部函数
    innerfunc
    被返回并赋值给
    myfunc
  • 称为
  • myfunc()
    ,本质上是
    innerfunc()
    。它打印
    x
    的值,即 7。
  • 您删除了
    outerfunc
    。但是,这对
    innerfunc
    innerfunc
    封闭的变量没有影响(在本例中为
    x
    )。
  • 你再次调用
    myfunc()
    ,它仍然打印7。

因此,当您创建闭包时,封闭的函数会维护对其周围状态的引用。在这种情况下,

x
的值保持在
innerfunc
之内,
outerfunc
被删除也没有关系。

这是闭包的一个非常强大的特性,广泛应用于各种编程场景,尤其是Python中的装饰器和回调函数中。

© www.soinside.com 2019 - 2024. All rights reserved.