首頁 >後端開發 >Python教學 >python中命名空間的三種方式介紹(附範例)

python中命名空間的三種方式介紹(附範例)

不言
不言轉載
2018-10-09 16:48:473173瀏覽

這篇文章帶給大家的內容是關於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没有则继续到上一级(全局)查找

再看一個例子:

#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內可以引用,但不可修改

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只能作用於局部變量,當使用後它會自動查找上一級局部命名空間是否有該變量,如果沒有繼續向上查找,直到最上一層「局部命名空間」

以上是python中命名空間的三種方式介紹(附範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除