日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

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

作者:落雨 ? 更新時間: 2022-08-10 編程語言

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

錯誤示例:

# 定義一個外部函數
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

原文鏈接:https://cloud.tencent.com/developer/article/1952408

欄目分類
最近更新