📜  Python中的范围解析| LEGB规则(1)

📅  最后修改于: 2023-12-03 15:04:37.206000             🧑  作者: Mango

Python中的范围解析 | LEGB规则

在Python中,当我们使用变量时,解释器需要确定该变量的作用域(即可见性范围)。LEGB规则是Python中用于确定变量范围的一种规则。

LEGB代表以下四个作用域:Local(局部)、Enclosing(嵌套)、Global(全局)和Built-in(内建)。

1. Local(局部)作用域

局部作用域是指在函数内部定义的变量,在函数外部是不可见的。这些变量只能在函数内部进行访问和修改。

def my_function():
    x = 10  # 局部变量
    print(x)

my_function()
# 输出:10

print(x)  # 错误!x是局部变量,无法在函数外部访问
2. Enclosing(嵌套)作用域

嵌套作用域是指在函数内部定义的函数中可见的变量。它允许内部函数访问外部函数的变量。

def outer_function():
    y = 20  # 外部函数变量

    def inner_function():
        print(y)  # 可以访问外部函数变量

    inner_function()

outer_function()
# 输出:20
3. Global(全局)作用域

全局作用域是指在模块的全局范围内定义的变量,在整个模块中都可见和可访问。

z = 30  # 全局变量

def my_function():
    print(z)  # 可以访问全局变量

my_function()
# 输出:30

print(z)
# 输出:30
4. Built-in(内建)作用域

内建作用域是指Python内建函数和模块中的变量。这些变量可以在任何地方访问。

import math

print(math.pi)  # 可以访问内建模块中的变量
# 输出:3.141592653589793
优先级和查找顺序

当我们引用一个变量时,Python解释器会按照LEGB的顺序查找变量。如果找到变量,则使用该变量,否则会引发NameError异常。

  • 首先查找局部(Local)作用域,如果变量在当前函数中定义,则使用它。
  • 如果变量没有在本地作用域中找到,解释器会查找上一级封闭(Enclosing)作用域。
  • 如果变量也没有在封闭作用域中找到,解释器会继续查找全局(Global)作用域。
  • 最后,如果变量仍然未找到,解释器会查找内建(Built-in)作用域。

使用LEGB规则可以更好地理解Python中变量的作用域和可见性范围。请确保在编写代码时遵守这些规则,以避免不必要的错误和混淆。