python基礎知識之函數初階——命名空間

python中的命名空間分三種:

內置的命名空間,在啓動解釋器的時候自動加載進內存的各類名字所在的空間,好比print,input等不須要定義就可使用的名字

全局命名空間,就是從上到下全部咱們定義的變量名和函數名所在的空間,是在程序從上到下被執行的過程當中加載進內存的。

局部命名空間,好比函數在執行時所開闢的空間,裏面存放了函數內部定義的各類名字,隨着函數執行結束 這個局部命名空間就消失了。

在局部命名空間可使用全局和內置命名空間中的名字

在全局命名空間可使用內置命名空間中的名字,但不能使用局部命名空間的。

在內置命名空間不能使用全局和局部的名字。

能夠形象地理解成內置命名空間具備最高級別,不須要定義就可使用,全局命名空間次之,最低級是局部命名空間。

當低級命名空間使用名字時首先會在自身的命名空間裏查找,若是有就使用,沒有的話就到上一級命名空間內查找,若是有就使用,沒有就繼續到更上一級空間內查找,直到頂層的內置命名空間,若是有就使用,沒有則會報錯。

舉個例子以下:

num = 1 #這是全局命名空間內定義的num = 1
def func1(): #這個函數會建立一個局部命名空間1
    num = 2  #這是在局部命名空間1定義的num = 2
    def func2(): #這個函數會建立一個局部命名空間2
        num = 3 #這是在局部命名空間2 內 定義的num = 3
        print(num) #這是在局部命名空間2內 使用num 變量
    func2() # 調用函數func2時 會執行該命令建立局部命名空間2
func1()  #調用函數func1時會建立局部命名空間1,
#這幾個命名空間的級別順序是:內置>全局>局部1>局部2
#當print(num)指令執行時它會在局部2內查找是否有num,發現有則直接引用,若是沒有則會到上一級(局部1)中查找,局部1沒有則繼續到上一級(全局)查找

再看一個例子:python

#max()函數是內置的函數,若是咱們在全局命名空間中定義了函數名爲max的函數時,則該函數就失效了,也就是說在自身空間內找到了max()後就不去內置命名空間查找了
def max(a,b,c):
    return 'max失效了?'
print(max(1,2,3))#
正常狀況下應該輸出3(max函數功能是返回最大值),可是由於咱們把max這個名字佔用了,因此當使用時程序就不去上一級空間(內置命名空間)去查找了

與命名空間有關的兩個函數globals()和locals()
能夠用globals()查看全局命名空間的全部定義的名字
能夠用locals()查看當前命名空間的全部定義的名字,在全局則返回全局,在局部則返回局部
這兩個函數的返回值能夠看做是字典,格式都是{key1:value1,key2:value2,.....}函數

當函數1內嵌套函數2時,對於函數1內的不可變數據類型的變量,函數2內能夠引用,但不可修改code

def func1():
    a = 1
    def func2():
        a = a + 1 
#此處會報一個嚴重錯誤,由於a同時出如今等號兩邊,Python會先執行等號右邊的表達式,
#發現你在引用a,而後它會先在本空間查找a,結果找到了等號左邊的a,其結果就是「在定義變量前引用變量」
        pass      
    func2()
func1()
#若是想要修改,可使用nonlocal(python3中新增)
def func1():
    a = 1
    def func2():
        nonlocal a
        a = a + 1
    func2()
    print(a) 
func1()
#咱們能夠看出,執行func2()後再輸出a,a已經變成2了
    2

nonlocal只能做用於局部變量,當使用後它會自動查找上一級局部命名空間是否有該變量,若是沒有繼續向上查找,直到最上一級「局部命名空間」

相關文章
相關標籤/搜索