python的作用域

在 Python 中,变量的作用域遵循 LEGB 规则,即变量查找顺序从内到外依次为:Local(本地)→ Enclosing(被嵌入的本地)→ Global(全局)→ Built-in(内置)。以下是对每个作用域的详细解释及示例:


1. 本地作用域(Local Scope)

  • 定义:当前函数或方法内部的变量。
  • 特点
    • 变量在函数内定义(使用=赋值或def定义新函数)。
    • 仅在函数执行期间存在,函数结束后销毁。
  • 示例
    def my_func():
        x = 10        # 本地作用域变量
        print(x)      # 输出 10
    
    my_func()
    # print(x)        # 报错!x 已销毁
    

2. 被嵌入的本地作用域(Enclosing Scope)

  • 定义:嵌套函数中,外层函数的作用域。

  • 特点

    • 仅存在于嵌套函数结构中。
    • 内部函数可以读取或修改外层函数的变量(需使用 nonlocal 关键字)。
  • 示例

    def outer():
        x = "enclosing"  # Enclosing 作用域变量
        def inner():
            print(x)     # 读取外层变量 → 输出 "enclosing"
        inner()
    
    outer()
    
  • 使用 nonlocal 修改外层变量

    def outer():
        x = 10
        def inner():
            nonlocal x
            x = 20      # 修改 Enclosing 作用域的 x
        inner()
        print(x)        # 输出 20
    
    outer()
    

3. 全局作用域(Global Scope)

  • 定义:模块(文件)级别的变量,在函数外定义。

  • 特点

    • 全局变量在程序启动时创建,程序结束后销毁。
    • 函数内默认只能读取全局变量,修改需使用 global 关键字。
  • 示例

    x = "global"        # 全局作用域变量
    
    def my_func():
        print(x)        # 读取全局变量 → 输出 "global"
    
    my_func()
    
  • 使用 global 修改全局变量

    x = 10
    def modify_global():
        global x
        x = 20         # 修改全局变量
    
    modify_global()
    print(x)           # 输出 20
    

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

  • 定义:Python 内置的预定义变量和函数(如 len, print, str 等)。
  • 特点
    • 在所有作用域中自动可用。
    • 可被局部或全局作用域的同名变量覆盖。
  • 示例
    # 正常使用内置函数
    print(len("hello"))  # 输出 5
    
    # 覆盖内置函数
    def my_func():
        len = 10        # 本地作用域覆盖内置 len
        print(len)      # 输出 10
    
    my_func()
    print(len("test"))  # 正常输出 4(全局作用域未覆盖)
    

作用域查找顺序(LEGB 规则)

当访问一个变量时,Python 按以下顺序查找:

  1. Local → 当前函数内。
  2. Enclosing → 外层嵌套函数内(如果存在)。
  3. Global → 模块级别。
  4. Built-in → Python 内置作用域。

若未找到,则抛出 NameError

示例

x = "global"

def outer():
    x = "enclosing"
    def inner():
        x = "local"
        print(x)              # 输出 "local"(Local)
        print(str)            # 输出 <class 'str'>(Built-in)
    inner()

outer()
print(x)                      # 输出 "global"(Global)

关键注意事项

  • 避免变量覆盖:慎用与内置函数同名的变量(如 list = [1, 2])。
  • 显式声明:修改全局或 Enclosing 变量时需使用 globalnonlocal
  • 作用域隔离:函数内的变量默认独立于外部(除非显式引用)。

理解作用域规则能有效管理变量生命周期,避免命名冲突和逻辑错误。

posted @ 2025-03-10 12:42  清澈的澈  阅读(59)  评论(0)    收藏  举报