作用域是一个Python程序中可以直接访问命名空间的文本区域。命名空间是从名称到对象的映射,用于管理不同代码库中的变量、函数、类等标识符。直接访问的意思是,一个没有限定的引用(如变量名)会尝试在命名空间中找到这个名称。
Python中有四种常见的作用域,分别是:
- 局部作用域(Local):最内层,包含局部变量,比如一个函数/方法内部。
- 嵌套作用域(Enclosing):包含了非局部 (non-local)也非全局 (non-global)的变量。比如两个嵌套函数,一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal。
- 全局作用域(Global):当前脚本的最外层,比如当前模块的全局变量。
- 内置作用域(Built-in):包含了内建的变量/关键字等,最后被搜索。
Python中的作用域是静态的,也就是说变量被赋值、创建的位置决定了其被访问的范围,而不是在运行时动态改变。Python中使用 LEGB 规则来确定一个变量在哪个作用域中被找到。LEGB 是 Local、Enclosing、Global 和 Built-in 的缩写,表示从最内层到最外层的查找顺序。如果在所有作用域中都找不到变量,就会抛出 NameError 异常。