【Python高级】06_闭包

11 阅读3分钟

Python闭包详解

思维导图

image.png

什么是闭包

闭包是Python中一个重要的概念,它满足以下三个条件:

1. 有嵌套:存在嵌套函数(内部函数定义在外部函数内部)

2. 有引用:内部函数引用了外部函数的变量

3. 有返回:外部函数返回内部函数的名称(内存地址)

作用域基础回顾

在理解闭包之前,需要先了解Python的作用域规则:

# 全局变量和局部变量示例
num1 = 10  # 全局变量

def fun1():
    num2 = 20  # 局部变量
    print(f"局部变量: {num2}")
    print(f"全局变量: {num1}")  # 局部作用域可以访问全局变量

fun1()
print(f"全局变量: {num1}")

变量修改规则

# 局部作用域修改全局变量需要使用global关键字
num1 = 10

def fun1():
    global num1
    num1 = 20
    print(f"局部修改后: {num1}")

fun1()
print(f"全局查看: {num1}")

闭包基本语法

def func():
    num = 10
    
    def inner():
        print(num)  # 引用了外部函数的变量
    
    return inner  # 返回内部函数

f = func()
print(f)  # 查看函数对象
f()  # 调用闭包函数

闭包的使用场景

数值累加器

# 带参数的闭包,实现数值累加
def fun():
    result = 0  # 外部函数的变量
    
    def inner(num):
        nonlocal result  # 使用nonlocal声明以修改外部变量
        result += num
        print(f"当前累加结果: {result}")
    
    return inner

# 创建闭包实例
f = fun()
f(1)  # 输出: 当前累加结果: 1
f(2)  # 输出: 当前累加结果: 3
f(3)  # 输出: 当前累加结果: 6

变量修改的关键字

# 使用nonlocal关键字修改外部函数变量
def fun():
    num = 10
    
    def inner():
        nonlocal num  # 声明引用外部变量
        num = 20
        print(f"内部函数修改后: {num}")
    
    print(f"修改前: {num}")
    inner()
    print(f"修改后: {num}")
    
    return inner

f = fun()
f()

闭包的核心要点

1. 变量生命周期延长

闭包使得外部函数的变量在函数返回后仍然存在,不会被销毁。

2. 数据封装

闭包可以实现数据的封装和隐藏,外部无法直接访问闭包内部的变量。

3. 状态保持

闭包可以保持函数的状态,每次调用都基于之前的状态进行操作。

闭包的注意事项

1. 内存管理:闭包会延长外部变量的生命周期,可能导致内存占用增加

2. 变量绑定:闭包中的变量是后期绑定的,需要注意循环中使用闭包的问题

3. 调试困难:闭包的调用栈可能比较复杂,调试时需要特别注意

实际应用示例

# 计数器工厂
def counter_factory():
    count = 0
    
    def counter():
        nonlocal count
        count += 1
        return count
    
    return counter

# 创建多个独立的计数器
counter1 = counter_factory()
counter2 = counter_factory()

print(counter1())  # 1
print(counter1())  # 2
print(counter2())  # 1 (独立的计数器)

通过以上内容,我们可以看到闭包在Python编程中的重要作用,它为函数式编程提供了基础支持,也是理解装饰器等高级特性的关键概念。