Python中什么是闭包?

闭包的定义

闭包(Closure)是Python中的一种函数机制。当一个内部函数引用了外部函数的变量,而外部函数已经执行完毕并返回了这个内部函数,内部函数仍然可以访问外部函数中的变量,这样的内部函数就是闭包。

示例代码解释

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

closure_func = outer_function(10)
print(closure_func(5))  # 输出 15
  1. 定义外层函数
    • 定义了outer_function函数,接收参数x
    • outer_function内部定义了inner_function函数,接收参数y,并返回x + y
    • outer_function返回内部函数inner_function
  2. 创建闭包
    • 调用outer_function(10),返回值赋给closure_func
    • 此时,closure_func是一个闭包,它“记住”了outer_function中的变量x的值(10)。
  3. 调用闭包
    • 调用closure_func(5),即调用inner_function并传入y=5
    • inner_function可以访问外部函数中的变量x(值为10),计算并返回x + y(10 + 5 = 15)。

闭包的使用场景

闭包常用于以下场景:

  1. 函数工厂:生成具有特定行为的函数。
  2. 装饰器:用于增强函数功能。
  3. 维持状态:例如计数器,允许创建带有状态的可重用函数,而无需依赖全局变量。

示例代码

def make_multiplier(n):
    def multiplier(x):
        return x * n
    return multiplier

times3 = make_multiplier(3)
print(times3(9))  # 输出 27

闭包的优势

  1. 避免全局变量:闭包可以避免使用全局变量,从而减少代码的副作用,使代码更模块化、更易于维护。
  2. 数据封装:通过闭包,可以隐藏一些状态信息,使外部无法直接访问和修改这些状态,增强了数据的封装性和安全性。

Cell对象

在Python中,闭包中的外部变量会被存储在一个叫做“cell对象”的东西里。可以通过函数对象的__closure__属性来访问这些cell对象。__closure__是一个元组,包含函数闭包中引用的每个变量的cell对象。

示例代码

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

closure_func = outer_function(10)
print(closure_func.__closure__[0].cell_contents)  # 输出 10

延迟计算和记忆化

闭包也常用于延迟计算或记忆化(Memoization)技术中。记忆化是一种优化技术,通过缓存函数的计算结果,当再次调用函数时如果参数相同可以直接返回缓存的结果,从而提高程序的效率。

示例代码

def memoize(f):
    cache = {}
    def memoized_function(x):
        if x not in cache:
            cache[x] = f(x)
        return cache[x]
    return memoized_function

@memoize
def slow_function(x):
    # 假设这是一个耗时很长的计算
    return x * x

print(slow_function(5))  # 第一次调用会计算并缓存结果
print(slow_function(5))  # 第二次调用时将从缓存中获取结果
posted @ 2025-05-22 13:52  luke0366  阅读(74)  评论(0)    收藏  举报