在 Python 中,作用域(Scope) 定义了一个变量或名称可以被访问和使用的范围。Python 的作用域机制是基于 LEGB(Local -> Enclosing -> Global -> Built-in)规则的,这个规则决定了在代码中查找变量名时,Python 的解释器会依次查看各个作用域,直到找到该变量或名称。

Python 作用域的层级(LEGB规则)

  1. L (Local) - 局部作用域

    • 这是当前正在执行的函数或方法内的作用域。任何在函数或方法内部定义的变量,都是局部变量,它们只能在该函数或方法内访问。
  2. E (Enclosing) - 闭包作用域

    • 如果在一个函数内定义了另一个函数(即内嵌函数),那么内嵌函数可以访问外层函数的局部变量。这种外层函数的作用域被称为闭包作用域。注意,闭包作用域适用于嵌套函数,但不适用于其他的作用域嵌套。
  3. G (Global) - 全局作用域

    • 这是在模块级别(文件级别)定义的变量所在的作用域。全局作用域中的变量可以在整个模块内的任何地方访问,只要在访问它们之前,它们已经被定义。
  4. B (Built-in) - 内建作用域

    • 这是 Python 内部预定义的所有内建名字的作用域,例如 print()len()int() 等内建函数和类型。在 Python 程序中,任何地方都可以访问这些内建对象。

LEGB 查找顺序

当你在 Python 中使用一个变量时,解释器会按以下顺序查找该变量:

  1. 局部作用域(L):首先查找当前函数或方法的局部作用域。
  2. 闭包作用域(E):如果在当前作用域找不到,则查找封闭函数的作用域。
  3. 全局作用域(G):如果仍然没有找到,则查找模块级别的作用域。
  4. 内建作用域(B):最后,如果仍然找不到,就查找 Python 的内建命名空间。

示例:作用域和 LEGB 规则

# 全局作用域
x = 10

def outer_function():
    # 闭包作用域
    x = 20
    def inner_function():
        # 局部作用域
        x = 30
        print(x)  # 局部作用域中的 x
    inner_function()
    print(x)  # 闭包作用域中的 x

outer_function()
print(x)  # 全局作用域中的 x
输出:
30  # 来自 inner_function 的局部作用域
20  # 来自 outer_function 的闭包作用域
10  # 来自全局作用域

解释:

  1. inner_function() 中,x = 30 是局部作用域中的变量,因此打印出 30
  2. outer_function() 中,x = 20 属于闭包作用域。由于 inner_function() 执行完毕后,打印 x 会看到的是 outer_function 作用域中的变量 x,即 20
  3. outer_function() 外部,x = 10 是全局作用域中的变量,最后打印全局作用域中的 x 值,即 10

关键点:

  • 局部作用域优先级最高,在当前函数中首先查找。
  • 闭包作用域优先于全局作用域。
  • 全局作用域优先级次之,模块级别的变量可以在整个模块中访问。
  • 内建作用域的优先级最低,包含 Python 内建的名称。

注意事项:

  • 函数参数也是局部变量,属于局部作用域的一部分。
  • 如果变量名在一个作用域中被赋值(例如局部变量),那么在该作用域中访问这个变量时,Python 会优先查找局部作用域中的值。如果没有赋值,Python 会查找外层作用域。

示例:未定义的变量查找

x = 10  # 全局作用域

def example():
    print(x)  # 查找 x

example()  # 会输出 10

example 函数中,x 没有在局部作用域中定义,所以 Python 会按照 LEGB 规则查找,最终会在全局作用域中找到并使用全局变量 x

总结

  • 作用域(Scope) 定义了变量名在代码中的有效范围。
  • LEGB 规则 决定了变量名的查找顺序:首先查找局部作用域,其次查找封闭作用域,再查找全局作用域,最后查找内建作用域。
  • Python 中的作用域机制使得变量的访问更加灵活和高效,同时也避免了命名冲突和混乱。
Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐