当前位置:首页 > Python > 正文

深入理解Python作用域(从零掌握局部变量、全局变量与LEGB规则)

在学习 Python作用域 的过程中,很多初学者常常对“变量在哪里能用”、“为什么这个变量报错”感到困惑。其实,只要理解了 Python 的作用域规则,这些问题就会迎刃而解。本文将用通俗易懂的方式,带你彻底搞懂 局部变量全局变量 以及核心的 LEGB规则

什么是作用域?

作用域(Scope)指的是程序中变量可以被访问的区域。简单来说,就是“变量在哪些地方有效”。Python 中的作用域决定了你能否在某段代码中使用某个变量。

深入理解Python作用域(从零掌握局部变量、全局变量与LEGB规则) Python作用域 局部变量 全局变量 LEGB规则 第1张

Python中的四种作用域(LEGB规则)

Python 使用 LEGB 规则 来查找变量。LEGB 是四个英文单词首字母的缩写,代表变量查找的顺序:

  • L (Local):局部作用域 —— 函数内部定义的变量。
  • E (Enclosing):嵌套作用域 —— 外层函数(闭包)中的变量。
  • G (Global):全局作用域 —— 模块(.py文件)顶层定义的变量。
  • B (Built-in):内置作用域 —— Python 内置的名称,如 lenprint 等。

当 Python 遇到一个变量名时,它会按照 L → E → G → B 的顺序依次查找,直到找到为止。

1. 局部变量(Local Scope)

在函数内部定义的变量称为局部变量,只能在该函数内部使用。

def my_function():    x = 10  # 局部变量    print(x)my_function()  # 输出: 10# print(x)     # 报错!NameError: name 'x' is not defined

上面的例子中,xmy_function 的局部变量,函数外部无法访问它。

2. 全局变量(Global Scope)

在函数外部、模块顶层定义的变量是全局变量,整个模块中都可以访问。

y = 20  # 全局变量def another_function():    print(y)  # 可以读取全局变量another_function()  # 输出: 20print(y)           # 输出: 20

但注意:如果你想在函数内部修改全局变量,必须使用 global 关键字,否则 Python 会认为你在创建一个新的局部变量。

count = 0  # 全局变量def increment():    global count  # 声明使用全局变量    count += 1increment()print(count)  # 输出: 1

3. 嵌套作用域(Enclosing Scope)

当函数内部又定义了函数(闭包),内层函数可以访问外层函数的变量,这就是嵌套作用域

def outer():    z = 30  # 外层函数的变量    def inner():        print(z)  # 内层函数可以访问 z    inner()outer()  # 输出: 30

如果要在 inner() 中修改 z,需要使用 nonlocal 关键字:

def outer():    z = 30    def inner():        nonlocal z        z = 40    inner()    print(z)  # 输出: 40outer()

4. 内置作用域(Built-in Scope)

这是最外层的作用域,包含 Python 自带的所有内置函数和异常,比如 len()range()ValueError 等。你不需要导入就能直接使用它们。

常见误区与最佳实践

  • 避免在函数内部无意识地创建与全局变量同名的局部变量。
  • 尽量少用 global,它会让代码难以维护。
  • 理解 LEGB 查找顺序,能帮你快速定位变量错误。

总结

掌握 Python作用域 是编写清晰、可靠代码的基础。记住:局部变量只在函数内有效,全局变量需谨慎修改,而 LEGB规则 是 Python 查找变量的黄金法则。通过本文的讲解和示例,相信你已经能自信地处理各种作用域问题了!

—— 学好作用域,写出更优雅的 Python 代码 ——