亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

詞匯閉包是如何工作的?

詞匯閉包是如何工作的?

函數式編程 2019-06-16 16:10:41
詞匯閉包是如何工作的?在研究Javascript代碼中的詞法閉包問題時,我在Python中遇到了這個問題:flist = []for i in xrange(3):     def func(x): return x * i     flist.append(func)for f in flist:     print f(2)注意,這個例子避免了lambda..它打印“44 4”,這是令人驚訝的。我希望“0 2 4”。這個等價的Perl代碼是正確的:my @flist = ();foreach my $i (0 .. 2){     push(@flist, sub {$i * $_[0]});}foreach my $f (@flist){     print $f->(2), "\n";}打印“0 2 4”。你能解釋一下區別嗎?最新情況:問題不是帶著i是全球性的。這將顯示相同的行為:flist = []def outer():     for i in xrange(3):         def inner(x): return x * i         flist.append(inner)outer()#~ print i   # commented because it causes an errorfor f in flist:     print f(2)如注釋行所示,i在這一點上是未知的。盡管如此,它還是打印了“4 4 4”。
查看完整描述

3 回答

?
米脂

TA貢獻1836條經驗 獲得超3個贊

循環中定義的函數一直在訪問同一個變量。i當它的價值改變的時候。在循環的末尾,所有函數都指向相同的變量,該變量保存了循環中的最后一個值:效果就是在示例中報告的結果。

為了評價i并使用它的值,常見的模式是將其設置為參數默認值:def語句,從而凍結循環變量的值。

預期的工作如下:

flist = []for i in xrange(3):
    def func(x, i=i): # the *value* of i is copied in func() environment
        return x * i
    flist.append(func)for f in flist:
    print f(2)


查看完整回答
反對 回復 2019-06-16
?
慕勒3428872

TA貢獻1848條經驗 獲得超6個贊

下面是如何使用functools庫(在提出問題時,我不確定它是否可用)。

from functools import partial

flist = []def func(i, x): return x * ifor i in xrange(3):
    flist.append(partial(func, i))for f in flist:
    print f(2)

輸出0 2 4,如預期的那樣。


查看完整回答
反對 回復 2019-06-16
  • 3 回答
  • 0 關注
  • 445 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號