Python中的延遲繫結

2021-10-11 18:11:54 字數 1169 閱讀 1219

延遲繫結出現在閉包問題中。下面我們看乙個閉包的例子:

def

gen_mul

(n):

defmul

(x):

return n*x

return mul

double = gen_mul(2)

double_value = double(6)

print

(double_value)

可以看出滿足閉包的幾點:

閉包的優點:

閉包的缺點:

現在我們來看看另乙個會引出延遲繫結的例子:

'''

'''def

multipliers()

:return

[lambda x : x*i for i in

range(4

)]print

([m(2)

for m in multipliers()]

)

上邊的例子會輸出[6,6,6,6],而不是我們預期的[0,2,4,6]。

這就是延遲繫結導致的結果。具體過程我們可以來分析下:

執行第三行時,會先執行multipliers函式,然後執行函式中的列表解析式。在每一次迭代的時候都會生成乙個匿名函式(這裡只是定義)作為元素。然後回到第三行,遍歷返回的列表中的匿名函式,傳入引數2並執行。

此時函式類似於這樣:

def

noname

(x):

return i * x

這裡的原因就是在python中,相對而言的區域性變數繫結的是值,非區域性變數繫結的是空間,而不是值得本身,在上面得例子中,for迴圈得i,相對於lambda函式而言,是全域性變數,所以繫結得是空間,最終導lambda函式執行得時候,讀取得是最後儲存i的值,解決辦法是通過函式的預設賦值,達到儲存臨時變數的作用。

def

multipliers()

:return

[lambda x,i=i : x*i for i in

range(4

)]print

([m(2)

for m in multipliers()]

)

lambda函式精簡,在使用的過程一定要小心這個坑!

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閉包的延遲繫結

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...

python 高階之路 繫結延遲

看看下面一題,試著寫出自己的答案。defmultipliers return lambda x i x for i in range 4 print m 2 for m in multipliers print type multipliers res 6,6,6,6 list 輸出結果不是我們想的...