Python函數編程——名稱空間

Python函數編程——名稱空間

名稱空間又名name space,顧名思義就是存放名字的地方,存什麼名字呢?舉例說明,若變量x=1,1存放於內存中,那名字x存放在哪裏呢?稱空間正是存放名字x與1綁定關係的地方。python

Python裏面有不少名字空間,每一個地方都有本身的名字空間,互不打擾,不一樣空間中的兩個相同名字的變量之間沒有任何關係。編程

名稱空間有4種:LEGB函數

  • locals:函數內部的名字空間,通常包括函數的局部變量以及形式參數。
  • enclosing function:在嵌套函數中外部函數的名字空間,若fun2嵌套在fun1裏,對fun2來講,fun1的名字空間就enclosing。
  • globals:當前的模塊空間,模塊就是一些py文件。也就是說,globals()相似全局變量。
  • builtins:內置模塊空間,也就是內置變量或者內置函數的名字空間。

不一樣變量的做用域不一樣就是由這個變量所在的名稱空間所決定的。ui

做用域即範圍spa

  • 全局範圍:全局存活,全局有效。
  • 局部範圍:臨時存活,局部有效。

查看做用域方法:globals()locals()code

做用域查找順序內存

當程序引用某個變量的名字時,就會從當前名字空間開始搜索。搜索順序規則即是:LEGB。即locals -> enclosing function -> globals ->builtins。一層一層的查找,找到了以後,便中止搜索,若是最後沒有找到,則拋出NameError的異常。作用域

level = 'L0'
n = 22
def func():
    level = 'L1'
    n = 33
    print(locals())
    def outer():
        n = 44
        level = 'L2'
        print("outer:",locals(),n)
        def inner():
            level = 'L3'
            print("inner:",locals(),n) #此外打印的n是多少?
        inner()
    outer()
func()

輸出io

{'n': 33, 'level': 'L1'}
outer: {'level': 'L2', 'n': 44} 44
inner: {'level': 'L3', 'n': 44} 44
相關文章
相關標籤/搜索