1 变量的作用域
Python是静态作用域,也就是说在Python中,变量的作用域源于它在代码中的位置;在不同的位置,可能有不同的命名空间。命名空间是变量作用域的体现形式。
2 LEGB各自代表的含义
2.1 L-Local
函数内的命名空间。作用范围:当前整个函数体范围。
2.2 E-Enclosing function locals
外部嵌套函数的命名空间。作用范围:闭包函数。
2.3 G-Global
全局命名空间。作用范围:当前模块(文件)。
2.4 B-Builtin
内建模块命名空间。作用范围:所有模块(文件)。
注意:Python中没有块级作用域。块级作用域,代码块中的变量,比如 if while for 后的代码。
3 LEGB规则
LEGB规则就是按照 L->E->G->B的顺序进行查找变量。也就说,当不同命名空间具有相同变量名称的变量时,我们首先查找局部变量,如果没查到,再向全局变量查找。
4 基于命名空间的常见变量类型
4.1 局部变量
在一个函数内部定义的变量。作用域为函数内部。查看局部变量命令:locals()。
4.2 全局变量
在函数外部,文件最外层定义的变量。作用域为整个文件内部。查看全局变量命令:globals()
4.3 注意
变量访问原则:从内到外。全局变量和局部变量重名时,采用就近原则。
4 案例讲解
4.1 代码如下
a = "G全局" # 定义了一个全局变量a,并把"G全局"赋值给a
def myfunc():
a = "E局部1" # 定义了一个局部变量a,并把"E局部1"赋值给a def inner():
a = "L局部2" # 定义了一个局部变量a,并把"E局部1"赋值给a
print("inner打印的a:", a)
inner()
print("myfunc打印的a:", a) myfunc()
print("__main__打印的a:", a)
4.2 代码执行结果
4.3 代码结果分析