一文读懂 Python 作用域

张开发
2026/5/17 21:31:12 15 分钟阅读
一文读懂 Python 作用域
在 Python 程序中变量、函数、类等名称并非在任何位置都能随意访问它们都有各自有效的使用范围这个范围就是作用域。作用域决定了一个名称在代码的哪些区域可见、可被引用也决定了同名变量之间是否会相互干扰。理解作用域是写出结构清晰、避免变量冲突的关键。一、作用域的核心意义作用域本质上是对名称的访问权限控制。合理的作用域规则可以避免不同代码块中同名变量互相覆盖限制变量的生命周期减少不必要的内存占用让代码逻辑更模块化内部变量不会意外暴露到外部。Python 对作用域的查找遵循一套固定顺序被称为LEGB 规则这是理解作用域的核心。二、Python 的四层作用域Python 从内到外把作用域分为四层每一层对应不同的代码环境。1. Local 局部作用域局部作用域是最内层的作用域通常对应一个函数内部。在函数内部定义的变量、函数参数都属于局部作用域只能在当前函数内部访问。函数执行结束后局部作用域会被销毁其中的变量也随之失效。2. Enclosing 嵌套外层作用域这一层专门存在于嵌套函数结构中也就是闭包场景。当一个函数内部又定义了另一个函数时外层函数的作用域对于内层函数来说就是嵌套外层作用域。内层函数可以访问这一层的变量但不能随意修改除非显式声明。3. Global 全局作用域全局作用域是整个模块文件的顶层空间。不在任何函数、类内部定义的变量和函数都属于全局作用域在整个文件范围内都可以被读取。全局变量在程序运行期间始终存在直到程序结束。4. Built-in 内置作用域这是 Python 最顶层的作用域包含解释器预先定义好的内置名称。比如常见的 print、len、int、list、True、False、None 等都属于这一层。任何代码都可以直接使用内置作用域中的名称不需要额外定义或导入。三、LEGB 查找顺序当 Python 在代码中遇到一个未确定归属的名称时会按照固定顺序逐层查找Local → Enclosing → Global → Built-in先在当前局部作用域查找找不到再向外查找嵌套外层作用域仍然找不到继续查找全局作用域最后查找内置作用域全部都找不到程序抛出名称未定义错误。这个顺序保证了内层变量会优先于外层同名变量避免了混乱。四、控制作用域的两个关键字在函数内部如果需要修改外层作用域的变量Python 要求显式声明否则会被当作新的局部变量。1. global用于在函数内部声明要使用和修改全局作用域的变量告诉解释器该变量不属于局部作用域。2. nonlocal用于在嵌套函数内部声明要使用和修改外层嵌套函数的变量既不是局部变量也不是全局变量。五、作用域带来的常见行为特点内层作用域可以读取外层作用域的变量但直接赋值会创建新的局部变量不会修改外层变量全局变量虽然随处可读但频繁使用会降低代码模块化程度也容易引发意外修改内置名称可以被覆盖但一旦覆盖原本的内置功能就会失效属于不规范写法变量必须先在对应作用域中定义之后才能被访问否则会报错。总结Python 作用域以LEGB为核心规则分为局部、嵌套外层、全局和内置四层。程序查找名称时从内到外依次搜索保证访问逻辑清晰。通过 global 和 nonlocal 可以实现跨作用域修改变量合理运用作用域能让代码更安全、更易于维护也能从根本上避免大量由变量冲突引发的错误。

更多文章