Python函式3------global、nonlocal、函式嵌套
本章重點:
global 講解
在函式內部修改全域變數
函式的嵌套使用
nonlocal 講解
global
global 是 python 內置的關鍵字 其作用是可以在函式內宣告一個全域變數,在上一章我們說到了,在區域空間里不能直接修改全域作用域的變數,其實修改是可以的,只是需要事先宣告,也就是要告訴解釋器 這是一個全域變數,一會修改的時候你就到全域去找它吧,
在函式內部修改全域變數
實體1:
-
num = 0 def func(): num += 1 func()結果:
UnboundLocalError: local variable 'count' referenced before assignment原因:在區域修改全域變數
num時沒有事先宣告num是一個全域變數,所以報錯該實體具體報錯原因前面 Python作用域中將 Local 區域作用域中 實體2 的時候已經講解過了,這里不再贅述
實體2:
-
num = 0 def func(): num = 1 print("in loclas ", num) # 列印函式內部的 num print("in globals ", num) # 列印全域的 num func()結果:
in globals 0in loclas 1
原因:
func里的變數num之所以結果是1并不是修改了全域變數,而是在區域名稱空間里重新創建了一個num變數,并給其賦值1,函式內部也就是區域作用域可以參考全域作用域的變數,但是不能直接修改,
實體3:
-
num = 0 def func(): global num # 宣告一個全域變數 num += 1 print("in loclas ", num) # 列印函式內部的 num print("in globals ", num) # 列印全域的 num func()結果:
-
in globals 0 -
in loclas 1
原因:在區域修改全域變數之前,先宣告了這個變數的來源
global num就是告訴解釋器 變數num是一個全域變數,如果一會在函式里面有針對num這個變數的修改操作就去全域名稱空間里面尋找這個num -
小結:
- 通過上面兩個實體我們可以得出,Python 在區域可以參考全域變數 但是不能直接修改
- Python 在 區域作用域要對一個全域作用域的變數進行修改或需要事先宣告這是一個全域變數,
函式嵌套
Python 函式嵌套是指 一個函式里面再定義一個函式
-
def func1(): x = 100 def func2(): print(x) func2() func1()結果:
func1>>> 100這個就是函式的嵌套,我們先來看一下嵌套函式的執行順序

- 這是詳細版本

- 這是簡化版本
- 你也可以理解為python程式在執行程序中是從上往下順序執行的,如果遇到
def function_name():python會直接跳過函式這段代碼不會執行里面的代碼 - 總之函式在Python程式中的執行順序一定看得懂,不然后面有很多東西你會跟不上的,
nonlocal
nonlocal 是 python 內置的關鍵字,其作用是可以在內層函式內宣告一個外部函式的變數,它的功能與global 相似,nonlocal 本質上是介于 全域作用域和區域作用域之間的,它僅在函式的嵌套使用時才起作用,
實體1:
-
def func1(): count = 1 def func2(): count += 1 func2() func1()結果:
UnboundLocalError: local variable 'count' referenced before assignment原因:原因跟上面
實體1一樣只不過不是全域變數而是 內層函式 修改外部函式前沒有事先宣告 python解釋器在內層函式里找不到count變數就會直接報錯
實體2:
-
def func1(): count = 1 def func2(): count = 100 print("in func2 ", count) # 列印內層函式的count func2() print("in func1 ", count) # 列印外層函式的count func1()結果:
in func2 100in func1 1
原因:內層函式與外層函式的關系就和全域和區域的關系一樣,內層函式可以參考外層函式的變數,但是無法直接修改,
注意:
func2里的count = 100并不是修改 外部函式的count變數,當你在內層函式里寫上變數名并給其賦值的時候,python如果看到區域名稱空間里沒有這個變數名稱,它就會創建一個新的變數并賦值,
實體3:
-
def func1(): count = 1 def func2(): nonlocal count count += 100 print("in func2 ", count) func2() print("in func1 ", count) func1()結果:
in func2 101in func1 101
原因:因為在修改變數
count之前 事先宣告了這個count是來自外層函式的count,解釋器在func2里執行到count += 100的時候就會直接到外層函式去尋找這個count變數,不管你套了多少層函式,python都只會按照就近原則,即最靠近 參考該變數的這個函式的count,但只要你宣告了nonlocalpython就不會去全域名稱空間搜索這個count變數,如果在外層函式查找不到這個變數就報錯,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/270620.html
標籤:Python
下一篇:Python模擬隨機漫步
