當深入研究詞法閉包的複雜性時,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」。這種意外的行為源自於 Python 處理詞法閉包的方式。
與 Perl 不同,Perl 為每次迭代創建一個新的閉包,Python 創建三個獨立的函數。然而,每個函數都保留了定義它的環境的閉包,即全域環境。這種共享閉包會導致每個函數都引用相同的可變變數 i,從而導致意外的輸出。
要解決此問題,必須採用修改後的解決方案。透過引入函數建立器並在循環內呼叫它,我們為每個具有唯一i 值的函數創建了不同的環境:
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)
此修改後的程式碼修正了問題,展示了Python 的方式之間微妙但顯著的差異和Perl 處理詞法閉包。透過了解所使用的特定程式語言的閉包行為,開發人員可以避免此類意外結果並編寫更健壯和可預測的程式碼。
以上是為什麼 Python 的閉包行為會在巢狀循環中產生意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!