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 代碼結果分析