自学内容网 自学内容网

如何理解Python中函数的闭包

一、概念示例

闭包是一种函数对象,它包含了它自己的代码和环境。这使得它可以访问外部函数的变量,即使外部函数已经执行完毕。

闭包(closure)中,函数和其引用的环境变量一起组成的整体。闭包允许函数访问其作用域之外的变量。如下面的函数中outer_function中的参数x=5会被closure函数记在闭包环境中。

def outer_function(x):
    def inner_function(y):
        return x + y
    return inner_function

closure = outer_function(5)
result = closure(3)
print(result)  # 输出 8

二、理解上述代码

以上代码分为以下几个部分:

1. 外部函数 outer_function(x)

这是一个普通的函数,接受参数 x。
内部定义了一个函数 inner_function(y),这个函数使用了外部函数的变量 x。

2. 内部函数 inner_function(y)

这是一个嵌套函数(定义在 outer_function 内)。
它依赖外部函数的变量 x。
由于 Python 的作用域规则,内部函数可以“记住”外部函数的变量,即使外部函数outer_function已经执行完毕并退出。

3. 返回值 inner_function

outer_function 的返回值是 inner_function 这个函数本身,而不是执行结果。
因此调用 outer_function(5) 会返回一个新的函数,这个函数绑定了 x=5 的环境。

4. 闭包的形成

当你调用 outer_function(5) 时,x=5 被记录在闭包环境中。
返回的 inner_function 记住了 x=5 的值。
即使 outer_function 已经执行完,inner_function 仍然可以访问到 x=5

三、执行过程解析

closure = outer_function(5)

调用 outer_function(5),返回一个函数 inner_function,它记住了 x=5。
closure 现在指向这个新生成的函数。

result = closure(3)

调用 closure(3) 相当于调用 inner_function(3)。
此时:y=3(作为 closure 的参数,x=5(来自闭包环境)。
返回结果是 x + y = 5 + 3 = 8。

print(result)  # 输出 8

最终结果输出为 8。

四、闭包的本质

inner_function 使用了 x,但 x 不在其本地作用域,而是在外部作用域(outer_function)中。
闭包的本质是“函数加上对其自由变量的绑定”。在这里,自由变量是 x。
闭包营造了持久化的环境。即使 outer_function 的执行结束,inner_function 仍然可以通过闭包访问 x。

五、实际意义

闭包在许多场景中很有用,例如:创建工厂函数、创建装饰器、封装变量以避免全局变量的使用等等。


原文地址:https://blog.csdn.net/henanlion/article/details/143818254

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!