巢狀函數中的局部變數
這個複雜的範例涉及巢狀函數和閉包,這可能會導致令人困惑的行為。讓我們揭開謎底。
巢狀函數執行
巢狀函數在執行時會存取父作用域中的變數。在本例中,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中文網其他相關文章!