python 閉包問題

2021-10-04 14:44:00 字數 918 閱讀 2133

學python,用rpa

www.i-search.com.cn/index.html?from=line1

問題:下面這段**的輸出結果將是什麼?

def multipliers():

return [lambda x: i * x for i in range(4)]

print([m(2) for m in multipliers()])

答:上面**輸出的結果是 [6, 6, 6, 6](不是我們想的 [0, 2, 4, 6])。

上述問題產生的原因是 python 閉包的延遲繫結。這意味著內部函式被呼叫時,引數的值在閉包內進行查詢。因此,當任何由 multipliers()返回的函式被呼叫時,i 的值將在附近的範圍進行查詢。那時,不管返回的函式是否被呼叫,for 迴圈已經完成,i 被賦予了最終的值 3。因此,每次返回的函式乘以傳遞過來的值 3,因為上段**傳過來的值是 2,它們最終返回的都是 6 即 (3*2)。

問題:什麼是閉包?

在函式內部再定義乙個函式,並且這個函式用到了外邊函式的變數,那麼將這個函式以及用到的一些變數稱之為 閉包。

問題:如何修改上面的 multipliers 的定義從而產生想要的結果?

一種解決方法就是用 python 生成器。

def multipliers_1():

for i in range(4):

yield lambda x: i * x

print([m(2) for m in multipliers_1()])

另外乙個解決方案就是創造乙個閉包,利用預設引數立即繫結。

def multipliers_2():

return [lambda x, i=i: i * x for i in range(4)]

print([m(2) for m in multipliers_2()])

python 閉包問題

問題 下面這段 的輸出結果將是什麼?def multipliers return lambda x i x for i in range 4 print m 2 for m in multipliers 答 上面 輸出的結果是 6,6,6,6 不是我們想的 0,2,4,6 上述問題產生的原因是 py...

python 閉包 python 閉包

閉包 因為python中函式也可以當作物件,所以如果出現當我們返回乙個函式,而該函式含有外部變數的時候就形成了閉包。閉包的特點 是個巢狀函式 可以獲得非區域性的變數 將函式當作物件返回 看乙個例子會更易理解 def make printer msg msg hi there def printer ...

python怎麼閉包 Python閉包

python閉包教程 閉包就是乙個 在閉包的記憶功能 在 python 中,獲到閉包中的變數讓閉包本身擁有了記憶效應,閉包中的邏輯可以修改閉包捕獲的變數,變數會跟隨閉包生命期一直存在,閉包本身就如同變數一樣擁有了記憶功能。python閉包定義詳解 語法def func param def func ...