python的命名空间_python中命名空间的三种方式介绍(附示例)
本篇文章給大家帶來的內容是關于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思否,如有侵犯,請聯系a@php.cn刪除
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的python的命名空间_python中命名空间的三种方式介绍(附示例)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 游戏角色坐标的保存间隔_使用C++编写飞
- 下一篇: python解释器调用_python入门