LEGB:
L:即locals,當前所在命名空間(函數或者模塊),函數參數也屬於命名空間內的變量
E:即enclosing function,外部嵌套函數的命名空間
G:即globals,全局變量
B:即內建模塊的命名空間,這些內建模塊都在__builtin__中
變量搜索的優先級:局部作用域(L)>嵌套作用域(E)>全局作用域(G)>內置作用域(B)
下面看個例子
1:
city = "zhengzhou" def cityname(): city = "shanghai" print city cityname() print city
執行。。。
shanghai zhengzhou
說明:模塊中的值爲zhengzhou的city變量是全局變量,函數cityname中的city變量爲局部變量,因此按照作用域搜索順序,函數中print 語句中的city值爲cityname函數內部的city,即函數內部city賦值不能改變外部作用域中的同名變量的值;函數外餓的print語句的city爲模塊中全局變量
2:上面例子中函數內部賦值怎麼可以修改外部作用域的同名變量的值
city = "zhengzhou" def cityname(): global city city = "shanghai" print city cityname() print city
執行。。。
shanghai shanghai
說明:這裏使用了關鍵字global,來聲明函數內部的city變量爲全局變量,由此在函數內部作用域可以修改全局變量
關鍵字nonlocal。
在python2中,閉包只能讀外部函數的變量,而不能改寫它。爲了解決這個問題,python3引入了nonlocal關鍵字,在閉包內用nonlocal聲明變量,就可以讓解釋器在外層函數中查找變量名。nonlocal與global類似,使用nonlocal關鍵字可以在一個嵌套函數中修改嵌套作用