看看下面一題,試著寫出自己的答案。defmultipliers():
return [lambda x: i * x for i in range(4)]
print([m(2) for m in
multipliers()])
(type(multipliers()))
res:
[6, 6, 6, 6]
'list
'>輸出結果不是我們想的[0,2,4,6],這是為什麼呢?如何輸出我們想的結果呢?
首先,上述問題產生的原因是python 閉包的延遲繫結。在這裡你可能會有疑問
,什麼是閉包?
在python 的核心程式設計裡,閉包定義如下:
如果在乙個內部函式裡,對外部作用域(但不是全域性作用域)的變數進行引用,那麼內部函式就被
認定為閉包。
總結為三點:
1、是乙個內嵌函式
2、對外部函式變數的引用
3、外部函式返回內嵌函式
簡單的閉包eg:
def counter(start_at=0):
count =[start_at]
defincr():
count[0] += 1
return
count[0]
return
incr
繼續剛才的問題,python 閉包的延遲繫結,意味著
內部函式被呼叫,時,引數的值在閉包內進行查詢。因此,
當任何有multipliers()返回的函式被呼叫時,i 的值
將在附近範圍進行查詢。那是不管返回函式是否被呼叫,
for迴圈已經完成,i被賦予最終值3,因此,每次返回的函式乘以
傳遞過來的值3 ,因為上段**傳過來的值是2,他們最終的返回都是6。
以匿名函式的形式,看著你可能存在疑惑,現在為你轉換成 for迴圈語句,
便於你理解。
deffunc():
fun_list =
for i in range(4):
deffoo(x):
return x*i
return
fun_list
for m in
func():
print m(2)
那現在考慮一下,如何輸出我們想的結果【0,2,4,6】?
兩種方法為您推薦:
方法一:
defmultipliers():
for i in range(4): yield
lambda x: i *x
print([m(2) for m in
multipliers()])
(type(multipliers()))
res:
[0, 2, 4, 6]
'generator
'>方法二:
defmultipliers():
return [lambda x, i=i: i * x for i in range(4)]
print([m(2) for m in
multipliers()])
(type(multipliers()))
res:
[0, 2, 4, 6]
'list
'>
python 延遲繫結(late binding)
usr bin env python3 coding utf 8 a test module author zhang shuai defoperator return lambda n n m for m in range 6 print o 3 for o in operator 這是由於閉包函...
Python中的延遲繫結
延遲繫結出現在閉包問題中。下面我們看乙個閉包的例子 def gen mul n defmul x return n x return mul double gen mul 2 double value double 6 print double value 可以看出滿足閉包的幾點 閉包的優點 閉包的...
Python閉包的延遲繫結
1.什麼是閉包,閉包必須滿足以下3個條 2.閉包的優點def add a def add b return a b return add ad 2 2 計算2 2的值,用類實現的話,相對麻煩 閉包使用nonlocal deftester start state start defnested lab...