在 Python 编程中,作用域(Scope)决定了变量的可见性和生命周期,而闭包(Closure)则是作用域机制的进阶应用,它让函数可以“记住”其定义时的环境。 理解作用域和闭包,不仅是写出正确代码的前提,更是掌握装饰器、回调函数、函数式编程等高阶技巧的基础。
然而,许多开发者对 Python 的变量查找规则(LEGB)只知其一不知其二,对global和nonlocal的用法也常常混淆。 本文将从底层原理出发,系统讲解 Python 的作用域层次、变量查找顺序、闭包的形成条件与典型应用,并通过大量实例帮助你彻底掌握这一核心机制。
📌 本文适合谁?
无论你是初学 Python 的新手,还是希望深入理解作用域与闭包、提升代码质量的进阶开发者,本文都将为你提供清晰、实用的指导。
一、作用域基础:LEGB 规则
Python 使用LEGB规则来决定变量的查找顺序,即:Local → Enclosing → Global → Built-in。 当在代码中引用一个变量时,Python 会按照这个顺序依次查找,直到找到第一个匹配的变量,否则抛出NameError。
1.1 Local(局部作用域)
局部作用域是指函数或方法内部的作用域。在函数内赋值的变量默认为局部变量,仅在函