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