對於上面的表達式,調用結果:app
>>> f = [lambda x:x*i for i in range(4)] >>> f[0](1) 3 # 1*3 >>> f[1](1) 3 # 1*3 >>> f[2](1) 3 # 1*3 >>> f[3](1) 3 # 1*3
>>> f[0](3) 9 # 3*3 >>> f[1](3) 9 # 3*3 >>> f[2](3) 9 # 3*3 >>> f[3](3) 9 # 3*3
上面的表達式展開以下:函數
1 def func(): 2 fs = [] 3 for i in range(4): 4 def lam(x): 5 return x*i 6 fs.append(lam) 7 return fs
當調用 func() 時,每循環一次,將 lam 函數的地址存到 fs 中。由於在每次循環中 lam函數都未綁定 i 的值,因此直到循環結束,i 的值爲3,並將 lam 中所用到的 i 值定爲 3 ,所以真正調用(例如f[0](3))的時候 i 值保持不變(爲3)。spa
展開後的調用方法:code
>>> def func(): ... fs = [] ... for i in range(4): ... def lam(x): ... return x*i ... fs.append(lam) ... return fs ... >>> f = func() >>> f[0](3) 9 >>> f[2](3) 9 >>> f[1](3) 9
另外一種將x換成i,就與傳入的x值無關了。(這裏 lambda 後面什麼參數都不跟)blog
>>> f = [lambda :i*i for i in range(4)] >>> f[0]() 9 >>> f[1]() 9 >>> f[2]() 9 >>> f[3]() 9
解釋同上面。class
對於上面的表達式,調用結果:變量
>>> f1 = [lambda i=i: i*i for i in range(4)] >>> f1[0]() 0 >>> f1[1]() 1 >>> f1[2]() 4 >>> f1[3]() 9
上面的表達式展開以下(爲了更直觀,替換了變量):lambda
1 def func(): 2 fs = [] 3 for i in range(4) 4 def lam(x=i): # 即 i=i 5 return x*x # 即 i*i 6 fs.append(lam) 7 return fs
當調用 func() 時,每循環一次,將 lam 函數的地址存到 fs 中。可是在每次循環中 lam函數都將 i 值綁定到了 x 上,因此直到循環結束,不一樣地址的 lam 函數的 x 值爲都不同,所以真正調用(例如 f[0]())的時候 x 值都爲當時被綁定的值。循環
但若是給 lam 函數傳了參數,例如 f[0](8),那麼全部的調用結果都爲傳參的平方。與上面解釋並不衝突,只是將傳的參數綁定到了 x 上。方法
>>> f1 = [lambda i=i: i*i for i in range(4)] >>> f1[0](8) 64 >>> f1[1](8) 64 >>> f1[2](8) 64 >>> f1[3](8) 64
哈哈哈哈,和第二種好像,只是變了一個字符,那麼結果就大不同了,哈哈哈哈
對於上面的表達式,調用結果:
>>> f2 = [lambda x=i: i*i for i in range(4)] >>> f2[0]() 9 >>> f2[1]() 9 >>> f2[2]() 9 >>> f2[3]() 9 >>> f2[0](7) 9 >>> f2[1](7) 9 >>> f2[2](7) 9
傳不傳參數都不影響結果。展開後:
1 def func(): 2 fs = [] 3 for i in range(4) 4 def lam(x=i): 5 return i*i 6 fs.append(lam) 7 return fs
雖然 lam 函數將 i 的值綁定到了 x 上,但函數體中並未使用 x,因此直到循環結束,i 的值變爲3,纔會在調用時使用。其實同第一種狀況是同樣的。
最後:我寫的也好亂,仍是多試試吧。