解讀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 解決方案
實現預期行為在 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中文網其他相關文章!