🎅例如咱們經常使用的內置函數 print len input
x = 1 #全局名稱空間 def foo(): #全局名稱空間 y = 2 🎅注意,"if"下面的定義的變量名都是全局的 if 1 > 0 z = 3 #全局 if 3 > 0: p = 555 #全局
def f() x = 222 #局部名稱空間 f() #函數調用結束失效
'內置名稱空間'----->'全局名稱空間'----->'局部名稱空間'
'局部名稱空間'----->'全局名稱空間'----->'內置名稱空間'
'局部名稱空間'----->'全局名稱空間'----->'內置名稱空間'
重要概念:名稱空間的嵌套關係是在函數定義階段(檢測語法)時肯定的,與函數調用的位置無關,與函數定義位置有關python
三種名稱空間必需要有的是 : 內置名稱空間, 全局名稱空間閉包
查找優先級示例函數
🎅從"f2"局部開始找 x = 3 def f1(): x = 2 def f2(): x =1 print(x) f2() f1() # 1 🎅將"f2"局部的刪除,就往上一層找,找到"f1" x = 3 def f1(): x = 2 def f2(): print(x) f2() f1() # 2 🎅再將"f1"裏面的刪除,因而找到了全局 x = 3 def f1(): def f2(): print(x) f2() f1() # 3
🎅在定義"f2"的以後,有定義了同一級別的"len",因此當打開函數"f2"運行的時候,本着優先級查找就先找到了"222" len = 111 def f1(): def f2(): print(len) # 222 len = 222 f2() f1() # 222
🎅在全局空間定義一個變量"x",函數"foo",在函數內部修改"x"的值 x = 111 def foo(): x = 222 foo() print(x) #111 #發現並沒有軟用 🎅使用"global"關鍵字以後 x = 111 def foo(): global x # 聲明下面的"x"屬於全局 x = 222 foo() print(x) #222 #發現成功了
🎅不作任何處理,此函數應該是打印"f2"函數下的"x = 333" x = 111 def f1(): x = 222 def f2(): x = 333 def f3(): x = 444 f3() print(x) #333 f2() f1() # 333 🎅使用"nonlocal"關鍵字 x = 111 def f1(): x = 222 def f2(): x = 333 def f3(): nonlocal x #將下面的"x = 444"變成了上一層的"x"的值 x = 444 f3() print(x) f2() f1() # 444 🎅若是外層函數都沒有"x"這個值,報錯 x = 111 #並不會去全局修改 def f1(): def f2(): def f3(): nonlocal x x = 444 f3() print(x) f2() f1() #報錯