首頁 > 後端開發 > Python教學 > 為什麼 Python 的詞法閉包行為與 Perl 不同?

為什麼 Python 的詞法閉包行為與 Perl 不同?

Patricia Arquette
發布: 2024-12-12 16:42:10
原創
121 人瀏覽過

Why Does Python's Lexical Closure Behavior Differ from Perl's?

解讀Python 與Perl 中的詞法閉包

在探索Javascript 中的詞法閉包時,出現了關於它們在Python 中的特殊行為的問題。考慮以下 Python 程式碼:

flist = []

for i in xrange(3):
    def func(x): return x * i
    flist.append(func)

for f in flist:
    print f(2)
登入後複製

令人驚訝的是,它輸出「4 4 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";
}
登入後複製

底層證券區別

關鍵區別在於閉包如何捕獲其環境。

  • Python:在循環內建立的函數都共享循環的閉包環境。當循環變數 i 被修改時,所有函數都引用相同的修改後的 i。
  • Perl: 在循環中建立的函數每個都有自己的閉包,捕獲 i 在它們運行時的值定義。

Python 解決方案

實現預期行為在 Python 中,您需要為每個函數強制使用單獨的環境。一種解決方案是創建一個函數創建器,它會傳回具有不同閉包的函數:

flist = []

for i in xrange(3):
    def funcC(j):
        def func(x): return x * j
        return func
    flist.append(funcC(i))

for f in flist:
    print f(2)
登入後複製

此方法確保每個函數都有自己獨特的閉包,並具有自己唯一的i 值。

以上是為什麼 Python 的詞法閉包行為與 Perl 不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板