python之作用域

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關鍵字可以在一個嵌套函數中修改嵌套作用


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章