Python 作用域
1. 什么是命名空间
2. globals、locals
3. LEGB 规则
1. 什么是命名空间
我们在编写 Python 程序的过程中,如果要使用变量和函数,都需要先对变量和函数命名后才能使用。Python 会把命名后的变量和函数分配到不同的命名空间,并通过名称来识别它们。
Python为什么要区分不同的命名空间呢?它有两个作用:一个作用是不同的命名空间对应不同的作用域;另外一个作用是防止命名冲突。
2. globals、locals
在提到变量的作用域时,经常提到局部变量和全局变量,之所以称之为局部、全局,就是因为他们的自作用的区域不同,这就是作用域。
3. LEGB 规则
Python 使用 LEGB 的顺序来查找一个符号对应的对象:
locals -> enclosing function -> globals -> builtins
locals
当前所在命名空间(如函数、模块),函数的参数也属于命名空间内的变量。
enclosing
外部嵌套函数的命名空间(闭包中常见)。
1 def fun1(): 2 a = 10 3 def fun2(): 4 # a 位于外部嵌套函数的命名空间 5 print(a)
globals
全局变量,函数定义所在模块的命名空间。
1 a = 1 2 def fun(): 3 # 需要通过 global 指令来声明全局变量 4 global a 5 # 修改全局变量,而不是创建一个新的 local 变量 6 a = 2
builtins
内建模块的命名空间。
Python 在启动的时候会自动为我们载入很多内建的函数、类,比如 dict,list,type,print,这些都位于 __builtin__ 模块中,可以使用 dir(__builtin__) 来查看。
在 Python 启动后,且没有执行程序员所写的任何代码前,Python 会首先加载该内建模块到内存。这也是为什么我们在没有 import 任何模块的情况下,就能使用这么多丰富的函数和功能了。
另外,该内建模块中的功能可以直接使用,不用在其前添加内建模块前缀,其原因是对函数、变量、类等标识符的查找是按 LEGB 法则,其中 B 即代表内建模块。
比如:内建模块中有一个 abs() 函数,其功能求绝对值,如 abs(-20) 将返回 20。