首頁 >後端開發 >Python教學 >Python 中的巢狀函數如何處理局部變數和閉包?

Python 中的巢狀函數如何處理局部變數和閉包?

Linda Hamilton
Linda Hamilton原創
2024-12-20 18:04:10776瀏覽

How Do Nested Functions Handle Local Variables and Closures in Python?

巢狀函數中的局部變數

這個複雜的範例涉及巢狀函數和閉包,這可能會導致令人困惑的行為。讓我們揭開謎底。

巢狀函數執行

巢狀函數在執行時會存取父作用域中的變數。在本例中,pet_function 是 get_petters 生成器中的巢狀函數。執行時,它會在 get_petters 範圍內搜尋變數。

閉包單元和局部變數

pet_function 有一個自由變數(籠子)。在編譯期間,這個自由變數由閉包單元表示。執行 pet_function 時,此閉包單元會檢查 get_petters 周圍範圍內的 cage 值。

動態尋找和閉包

當 funs 清單時,會出現有問題的行為被建立。此時,get_petters 中的 cage 的值為「cat」。當呼叫 funs 中的每個函數時,pet_function 中的閉包單元會在該函數呼叫時尋找 cage 的值,而不是在定義它時。

訪問不同的動物

為了解決此問題,pet_function 需要訪問每個動物的籠子物件的特定實例。這可以透過部分函數、新函數作用域或關鍵字參數來實現。

部分函數

部分函數建立一個具有固定參數的新函數。以下是使用functools.partial() 的範例:

def pet_function(cage=None):
    print("Mary pets the " + cage.animal + ".")

yield (animal, partial(gotimes, partial(pet_function, cage=cage)))

新函數作用域

建立新函數作用域可確保籠變數綁定在新定義的範圍內函數。

def scoped_cage(cage=None):
    def pet_function():
        print("Mary pets the " + cage.animal + ".")
    return pet_function

yield (animal, partial(gotimes, scoped_cage(cage)))

關鍵字參數

綁定cage變數作為關鍵字參數的預設值:

def pet_function(cage=cage):
    print("Mary pets the " + cage.animal + ".")

yield (animal, partial(gotimes, pet_function))

以上是Python 中的巢狀函數如何處理局部變數和閉包?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn