python中的闭包是什么,昨天被面试官问到了,我还以为是左闭右开区间中的“闭”…
1. 闭包的基本概念
闭包(Closure):由函数及其相关的引用环境组合而成的一个整体(即:闭包=函数+引用环境),意味着该函数不仅可以访问到它自己内部的变量,还能访问到其外部函数的变量。
创建闭包需要满足的几个条件:
- 必须有一个内嵌函数
- 内嵌函数需要引用外部函数的变量
- 外部函数的返回值必须是内嵌函数
def outer_function(text):
def inner_function():
print(text)
return inner_function
my_function = outer_function('Hello, World!')
my_function()
闭包解释:
outer_function
是外部函数,接收参数text
。inner_function
是内嵌在outer_function
内部的函数,访问了外部函数的局部变量text
。outer_function
的返回值是inner_function
这个函数自身,而不是函数的执行结果。my_function
被赋值为outer_function
返回的inner_function
函数,当调用my_function()
时,实际上是在执行inner_function()
。
通过这个例子可以看到,即便是在外部函数执行完毕后,内部函数仍然可以访问到外部函数的局部变量 text
。这种机制,就是闭包的工作原理。
2. 闭包的应用实例
闭包可以在多种场景中发挥作用。例如,可以用来创建装饰器、延迟执行的函数等。
2.1 使用闭包创建装饰器
装饰器本质上是一个接受函数作为参数并返回一个新函数的闭包。
def my_decorator(func):
def wrapped():
print("函数准备执行")
func()
print("函数执行完毕")
return wrapped
@my_decorator
def my_function():
print("Hello, World!")
my_function()
代码解释:
my_decorator
是一个装饰器,它本质上是一个闭包,接受一个函数func
并返回一个新的函数wrapped
。wrapped
函数在调用原有func
函数前后,添加了打印操作。- 使用
@my_decorator
语法,将my_decorator
应用到my_function
上,每次调用my_function
都会执行wrapped
中的代码。
2.2 使用闭包实现数据封装
闭包也可以用来封装数据,在很多需要创建对象而又不想使用类的场景中非常有用。
def make_multiplier(x):
def multiplier(n):
return x * n
return multiplier
double = make_multiplier(2)
triple = make_multiplier(3)
print(double(5)) # 输出 10
print(triple(5)) # 输出 15
make_multiplier
函数创建并返回了一个multiplier
函数,该函数能够记住外部函数的变量x
。double
和triple
函数分别固定了乘数为 2 和 3。这样就创建了两个功能不同的函数,但它们都源于同一个外部函数。
3. 闭包的限制与注意事项
- 闭包可以导致某些变量不会被垃圾回收,从而增加内存的使用。
- 确保不要在闭包内部修改外部变量的值,这可能会导致难以追踪的bug。
推荐我的相关专栏: