Python中的LEGB规则:了解作用域解析顺序
在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",因为全局变量的值没有被修改。
相关文章