Python闭包详解

133 阅读2分钟

什么是闭包

简单来说,闭包是指一个函数(内部函数)引用了其外部函数的变量,并且这个外部函数的变量能够在外部函数调用结束之后依然被访问。闭包是一种特殊的函数,它“记住”了其创建时的环境。

示例

def outer():
    x = 10  # outer 函数的局部变量
    def inner():
        print(x)  # inner 函数引用了 outer 函数的 x
    return inner  # 返回 inner 函数

closure_func = outer()  # 调用 outer,返回 inner 函数
closure_func()  # 调用 inner 函数,输出 10

在上面的代码中,inner 是一个内部函数,它引用了外部函数 outer 的局部变量 x。虽然 outer 函数已经执行完毕,但 inner 函数仍然能够访问到 x,这就是闭包的体现。

闭包的核心特性

  1. 函数嵌套:闭包通常涉及到一个函数内部定义另一个函数,即外部函数返回一个内部函数。
  2. 自由变量:闭包中的内部函数引用了外部函数的局部变量,而这些变量通常是外部函数的自由变量(即在内部函数外部没有定义的变量)。
  3. 闭包的生命周期:闭包能够“记住”它创建时的环境,即使外部函数的执行已经结束,闭包中的自由变量依然存在。

自由变量很关键,如果在闭包函数中需要对外部函数的局部变量进行赋值,必须要用nonlocal进行声明。下面举个简单的自增函数,因为count有赋值操作,如果不加nonlocal关键字,count就会变成局部变量,

def counter():
    count = 0
    def increment():
        nonlocal count
        count += 1
        return count
    return increment

counter1 = counter()

print(counter1())  # 输出 1
print(counter1())  # 输出 2

闭包与内存

闭包是Python中非常重要的一个特性,但它也带来了一些内存管理上的挑战。由于闭包会持有对外部函数局部变量的引用,长时间存活的闭包可能会导致这些变量无法被垃圾回收,从而造成内存泄漏。因此,在设计闭包时,需要特别注意闭包的生命周期,避免不必要的内存占用。