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