Python中的LEGB规则:了解作用域解析顺序

2023-03-22 00:00:00 规则 解析 顺序

在Python中,变量的作用域解析顺序遵循LEGB规则,即Local(局部)、Enclosing(嵌套)、Global(全局)、Built-in(内置)。

  • Local:指函数内部定义的变量。
  • Enclosing:指嵌套函数中定义的变量,即在一个函数内部定义另一个函数,并在该函数内部使用的变量。
  • Global:指在模块级别定义的变量,即在函数外部定义的变量。
  • Built-in:指Python内置的函数和变量,如print()和len()等。

在使用一个变量时,Python会按照LEGB的顺序在不同的作用域中查找该变量。具体地说,Python首先在函数内部查找该变量,如果找不到,就在嵌套函数中查找,然后是全局变量,最后是内置变量。如果在任何一个作用域中找到了该变量,Python就停止搜索并使用该变量。如果在所有作用域中都找不到该变量,Python会引发NameError异常。

例如,以下代码中使用了LEGB规则来查找变量website:

website = "pidancode.com"

def outer_function():
    website = "皮蛋编程"

    def inner_function():
        nonlocal website
        website = "pidancode.cn"
        print(website)

    inner_function()
    print(website)

outer_function()
print(website)

在上面的代码中,函数inner_function中使用了nonlocal关键字来声明变量website为嵌套作用域的变量,这样就可以修改outer_function中的变量website的值。输出结果为:

pidancode.cn
pidancode.cn
pidancode.com

可以看到,函数inner_function首先在嵌套作用域中查找变量website,然后在全局作用域中查找。因为在嵌套作用域中找到了该变量,所以使用了嵌套作用域中的变量,并将其值修改为"pidancode.cn"。然后,在outer_function中输出该变量的值,发现值已经被修改为"pidancode.cn"。最后,在全局作用域中输出该变量的值,发现值仍为"pidancode.com",因为全局变量的值没有被修改。

相关文章