python中使用閉包及修改外部函式的區域性變數

函式中定義函式

在python中,函式可以被巢狀定義,也就是說,函式中可以定義函式。該函式還可以將其內部定義的函式作為返回值返回。

def func(): print(“這是外部的函式”) def func1(): print(“這是裡面的函式”) return func1 func()print(“*” * 50) # 由於func()的返回值就是函式# 因此我們可以透過func()()呼叫裡面的函式func()()複製程式碼

閉包

閉包的定義:一般來說,我們可以認為,如果一個函式可以讀取其他函式中的區域性變數,那麼它們就構成了閉包。

注意

:閉包的定義不是特別清晰,但大體上的意思是這樣的。

我們知道,普通的函式是可以使用全域性變數的

a = 100 # 此時,a=100是一個全域性變數# 但是在該函式中,是可以使用全域性變數的def func(): print(“a: ”, a) func()複製程式碼

類似的,函式中定義的函式,也是可以使用外部函式的變數的。因此,滿足了函式讀取了其他函式區域性變數的這一條件,他們因此構成了閉包。

def func(): a = 100 # 此時的a為函式func的區域性變數 # 區域性變數a可以被func函式中定義的內部函式所讀取 def func1(): print(a) return func1 func()()複製程式碼

在閉包的使用中,我們可以先給外部的函式賦予不同的區域性變數,然後再呼叫其中內部的函式時,就可以讀取到這些不同的區域性變量了。

def func(x, y): def func1(a, b): return a * x + b * y return func1 f = func(3, 5)print(f(1, 2))print(f(2, 3)) f2 = func(4, 6)print(f2(1, 2))print(f2(2, 3))複製程式碼

外部變數的使用 在普通函式中,雖然可以直接使用全域性變數,但是不可以直接修改全域性變數。從變數的作用域來說,一旦你嘗試修改全域性變數,那麼就會嘗試建立並使用一個同名的區域性變數。因此,如果你需要在普通函式中修改全域性變數,需要使用global

a = 100 def func1(): # 直接使用全域性變數,可以 print(“func1:”, a) def func2(): # 直接修改全域性變數,不可以 # 該程式碼會建立同名的區域性變數 a = 200 print(“func2:”, a) def func3(): global a a = 300 print(“func3:”, a) func1() # 執行完func2,全域性的a的值不會被改變func2()print(a) # 執行func3,全域性的a的值發生了改變func3()print(a)複製程式碼

同樣的,如果你希望透過定義在內部的函式去修改其外部函式的變數,那麼必須使用nonlocal

def func1(): a = 100 def func1_inner(): a = 200 func1_inner() print(“func1:”, a) # 此時a仍然為100,不會被修改 def func2(): a = 100 def func2_inner(): nonlocal a a = 200 func2_inner() print(“func2:”, a) # 此時a已經被修改為了200 func1()func2()