首頁 > 軟體

Python進階學習修改閉包內使用的外部變數

2022-06-17 14:03:26

修改閉包內使用的外部變數

錯誤範例:

# 定義一個外部函數
def func_out(num1):
    # 定義一個內部函數
    def func_inner(num2):
        # 這裡本意想要修改外部num1的值,實際上是在內部函數定義了一個區域性變數num1
        num1 = 10
        # 內部函數使用了外部函數的變數(num1)
        result = num1 + num2
        print("結果是:", result)
    print(num1)
    func_inner(1)
    print(num1)
    # 外部函數返回了內部函數,這裡返回的內部函數就是閉包
    return func_inner
# 建立閉包範例
f = func_out(1)
# 執行閉包
f(2)

錯誤範例:

# 定義一個外部函數
def func_out(num1):
    # 定義一個內部函數
    def func_inner(num2):
        # 這裡本意想要修改外部num1的值,實際上是在內部函數定義了一個區域性變數num1
        nonlocal num1  # 告訴直譯器,此處使用的是 外部變數a
        # 修改外部變數num1
        num1 = 10
        # 內部函數使用了外部函數的變數(num1)
        result = num1 + num2
        print("結果是:", result)
    print(num1)
    func_inner(1)
    print(num1)
    # 外部函數返回了內部函數,這裡返回的內部函數就是閉包
    return func_inner
# 建立閉包範例
f = func_out(1)
# 執行閉包
f(2)

小結

修改閉包內使用的外部函數變數使用 nonlocal 關鍵字來完成。

閉包與閉包中修改外部變數

在函數巢狀的前提下,內部函數參照了外部函數的變數,並且外部函數返回(return)了內部函數,即外部函數返回了參照了外部函數變數的內部函數,這時我們稱內部函數為閉包。 比如說如下例子:

# 外部函數
def func_outer(a):
    # 內部函數
    def func_inner(b):
        c = a + b
        return c
    return func_inner
# 建立閉包範例
f = func_outer(1)
# 執行閉包
num1 = f(2)
num2 = f(3)
print(num1)
print(num2)

在這裡,f就叫做閉包的範例,func_inner函數就叫做閉包 此時執行結果如下:

可以見得,f裡封存了外部函數的變數1,當閉包範例建立出來,再實行閉包範例,此時相當於1+2和1+3,得到了如上結果。 使用debug可以檢視到,執行完f = func_outer(1)程式碼後,此時一個函數物件已經儲存在記憶體當中:

當一開始步入程式碼num1 = f(2)(實行閉包)後:

一個外部函數.內部函數的物件儲存在了記憶體中,注意:在執行完f = func_outer(1)並沒有立即產生這樣一個物件,而是在呼叫時才會產生該物件 這時,再步入內部函數:

這樣c=3便出現了,此時在列印c就會出現3,4的出現與3的原理一樣

修改外部函數的變數

程式碼如下:

# 外部函數
def func_outer(a):
    # 內部函數
    def func_inner(b):
        nonlocal a
        a = 2
        c = a + b
        return c
    return func_inner
# 建立閉包範例
f = func_outer(1)
# 執行閉包
num1 = f(2)
num2 = f(3)
print(num1)
print(num2)

多了一行nonlocal a 這裡的nonlocal關鍵字是宣告我這裡用的是外部的a,而不是自己新定義的區域性變數a

以上就是Python進階學習修改閉包內使用的外部變數的詳細內容,更多關於Python修改閉包內外部變數的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com