python——做用域之LEGB規則

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

    

相關文章
相關標籤/搜索