python中for x in range_python教程:对 [lambda x: x*i for i in range(4)] 理解
題目:
lst = [lambda x: x*i for i in range(4)]
res = [m(2) for m in lst]
print res
實際輸出:[6, 6, 6, 6]
想要輸出 [0, 2, 4, 6] 應(yīng)該怎么改?如下:
lst = [lambda x, i=i: x*i for i in range(4)]
res = [m(2) for m in lst]
print res
這個問題涉及到了Python的閉包及延時綁定的知識(Python作用域)。
在Python核心編程里,閉包的定義如下:
如果在一個內(nèi)部函數(shù)里,對外部作用域(但不是在全局作用域)的變量進行引用,那么內(nèi)部函數(shù)就被認定是閉包。
總結(jié)為三點:
1、是一個內(nèi)嵌函數(shù)
2、對外部函數(shù)變量引用
3、外部函數(shù)返回內(nèi)嵌函數(shù)
簡單的閉包例子:
def counter(start_at=0):
count = [start_at]
def incr():
count[0] += 1
return count[0]
return incr
上面的那道題,可以寫成這樣:
'''
遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流QQ群:778463939
尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學(xué)習(xí)教程和PDF電子書!
'''
def func():
fun_list = []
for i in range(4):
def foo(x):
return x*i
fun_list.append(foo)
return fun_list
for m in func():
print m(2)
func()是一個包含四個函數(shù)的列表:
[, , , ]
當我們執(zhí)行 m(2) 時,運行到foo()內(nèi)部函數(shù),發(fā)現(xiàn)變量 i 并不是foo()中的變量,于是就到外部函數(shù)func中尋找變量 i ,但此時外部的 for 已經(jīng)循環(huán)完畢,最后的 i =3 。所以,每次
執(zhí)行m(2),i 的值都是 3 ,因此,最終結(jié)果會是 [6, 6, 6, 6] 。
當在foo()中添加 i=i 后,即:
def func():
fun_list = []
for i in range(4):
def foo(x, i=i):
return x*i
fun_list.append(foo)
return fun_list
for m in func():
print m(2)
這樣的話,for循環(huán)執(zhí)行時,就已經(jīng)把 i(0, 1, 2, 3) 的值傳給了foo()函數(shù),此時的 i 已經(jīng)是foo()函數(shù)的內(nèi)部變量,運行到foo()函數(shù)時,就不會到外部函數(shù)尋找變量 i ,直接運行
總結(jié)
以上是生活随笔為你收集整理的python中for x in range_python教程:对 [lambda x: x*i for i in range(4)] 理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ddos的肉鸡怎么来(ddos如何控制肉
- 下一篇: python gevent教程_Pyth