問題:下面這段**的輸出結果將是什麼?
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 閉包問題
學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 multi...
python 閉包 python 閉包
閉包 因為python中函式也可以當作物件,所以如果出現當我們返回乙個函式,而該函式含有外部變數的時候就形成了閉包。閉包的特點 是個巢狀函式 可以獲得非區域性的變數 將函式當作物件返回 看乙個例子會更易理解 def make printer msg msg hi there def printer ...
python怎麼閉包 Python閉包
python閉包教程 閉包就是乙個 在閉包的記憶功能 在 python 中,獲到閉包中的變數讓閉包本身擁有了記憶效應,閉包中的邏輯可以修改閉包捕獲的變數,變數會跟隨閉包生命期一直存在,閉包本身就如同變數一樣擁有了記憶功能。python閉包定義詳解 語法def func param def func ...