在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python/ Python閉包輸出問題

Python閉包輸出問題

本人最近在學(xué)習(xí)閉包,動(dòng)手寫了一個(gè)計(jì)算移動(dòng)平均的高階函數(shù),但是在輸出的時(shí)候和自己的預(yù)期有出入,錯(cuò)誤代碼如下:

def averager():
    sum = 0
    n = 0
    def avg(i):
        nonlocal sum, n
        sum += i
        n += 1
        return print(sum/n)
    return avg
      
a=averager()(3)
a=averager()(5)
a=averager()(7)

我知道代碼錯(cuò)在:

a=averager()(3)
a=averager()(5)
a=averager()(7)

因?yàn)楦某?

a=averager()
a(3)
a(5)
a(7)

就能夠正確的計(jì)算移動(dòng)平均值了,正確的輸出分別是 3, 4, 5。

然后問題來了,我想請(qǐng)教兩個(gè)問題;

  1. 我的錯(cuò)誤代碼錯(cuò)在哪里?
  2. 我看到正確代碼中閉包對(duì)于傳入的 3, 5, 7 都會(huì)存到 sumn 兩個(gè)自由變量中,這個(gè)存儲(chǔ)的機(jī)制可以幫我解釋一下嗎?

感激不盡!

回答
編輯回答
逗婦乳

python引用變量的順序: 當(dāng)前作用域局部變量->外層作用域變量->當(dāng)前模塊中的全局變量->python內(nèi)置變量
nonlocal sum,n聲明直接引用外層作用域變量,也就是內(nèi)層函數(shù)avg()之外,averager()中的兩個(gè)變量.
這樣執(zhí)行a = averager()就相當(dāng)于初始化了sumn,之后調(diào)用a(3), a(5), a(7)因?yàn)?code>sum, n直接從外層作用域調(diào)用,所以值進(jìn)行了累加.
而如果每次都執(zhí)行a = averager()(n)就相當(dāng)于每次都對(duì)'sum, n'進(jìn)行了一遍初始化

2017年11月28日 10:33