闭包与作用域的理解

1. 闭包(Closure)
  • 定义:闭包是一个函数与其"捕获"的外部变量(来自外层作用域的变量)的组合。即使外层函数已经执行完毕,内部函数仍能记住并访问这些变量。
  • 核心机制:当内层函数引用了外层函数的变量时,Python 会将这些变量绑定到闭包中,使其生命周期延长至闭包存在期间。

例子

python 复制代码
def outer():
    x = 10  # 外层函数的变量
    def inner():
        print(x)  # 内层函数捕获了外层变量x
    return inner

closure = outer()  # outer()执行完毕,x本应被销毁
closure()  # 输出:10 → 但闭包仍然能访问x!
  • 关键点
    • 闭包的本质是 函数 + 环境变量 的捆绑。
    • 闭包中的变量是"记忆"的,而非实时查找的(注意循环陷阱,如延迟绑定问题)。

2. 作用域(Scope)

Python 使用 LEGB 规则 查找变量:

  • L(Local):当前函数内部。
  • E(Enclosing):外层嵌套函数(闭包的关键!)。
  • G(Global):模块全局作用域。
  • B(Built-in) :内置函数(如 print, len)。

例子

python 复制代码
x = "global"
def outer():
    x = "outer"
    def inner():
        x = "inner"
        print(x)       # 输出:inner (Local优先)
    inner()
    print(x)           # 输出:outer (Enclosing)
outer()
print(x)               # 输出:global (Global)
  • 闭包与作用域的联动
    当内层函数访问外层函数的变量时,Python 会将这些变量"冻结"到闭包中,即使外层函数已执行完毕,闭包仍能通过 Enclosing作用域 访问它们。

总结

  • 闭包:是函数式编程的核心概念,让函数能"记住"外部状态,是装饰器实现的基础。
  • 作用域:通过 LEGB 规则控制变量的可见性,闭包通过 Enclosing 作用域实现变量捕获。
相关推荐
程序员小远4 小时前
软件测试之单元测试详解
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·测试用例
心无旁骛~4 小时前
python多进程和多线程问题
开发语言·python
星云数灵4 小时前
使用Anaconda管理Python环境:安装与验证Pandas、NumPy、Matplotlib
开发语言·python·数据分析·pandas·教程·环境配置·anaconda
计算机毕设匠心工作室5 小时前
【python大数据毕设实战】青少年抑郁症风险数据分析可视化系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习
后端·python
计算机毕设小月哥5 小时前
【Hadoop+Spark+python毕设】智能制造生产效能分析与可视化系统、计算机毕业设计、包括数据爬取、Spark、数据分析、数据可视化、Hadoop
后端·python·mysql
计算机毕设小月哥7 小时前
【Hadoop+Spark+python毕设】中风患者数据可视化分析系统、计算机毕业设计、包括数据爬取、Spark、数据分析、数据可视化、Hadoop
后端·python·mysql
Keep_Trying_Go7 小时前
基于Zero-Shot的目标计数算法详解(Open-world Text-specified Object Counting)
人工智能·pytorch·python·算法·多模态·目标统计
计算机毕设匠心工作室7 小时前
【python大数据毕设实战】强迫症特征与影响因素数据分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习、实战教学
后端·python·mysql
Trouville018 小时前
Pycharm软件初始化设置,字体和shell路径如何设置到最舒服
ide·python·pycharm