python 高階之路 繫結延遲

2022-06-25 12:03:12 字數 1676 閱讀 2892

看看下面一題,試著寫出自己的答案。

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

'>輸出結果不是我們想的[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()])

print

(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()])

print

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