求教一下表達式各變量是怎么變化的,以及結果,尤其是n怎么變呢?
fun = [(lambda n : i + n) for i in range(10)]
lambda函數(shù)是里面的i是一個全局變量i,但是由于lambda函數(shù)里面所有的值只有在運行時確定。也就是當我們:
[(lambda n : i + n) for i in range(10)][1](10)
lambda里面的i已經(jīng)迭代到 9,所以就變成了如fun列表就變成了如下:
[lambda n: 9 + n,
lambda n: 9 + n,
lambda n: 9 + n,
lambda n: 9 + n,
lambda n: 9 + n,
lambda n: 9 + n,
lambda n: 9 + n,
lambda n: 9 + n,
lambda n: 9 + n]這是 python 中為數(shù)不多的“怪事”之一
fun = [(lambda n: i+n) for i in range(10)]
# 等同于
fun = [(lambda n: 9+n) for _ in range(10)]
因為 lambda 內(nèi)的參數(shù) i 在運行時才能確定,不是在聲明時確定。
最后 fun 保存了含有 10 個元素的數(shù)組,每一個元素都是 lambda 方法,該方法等于下面的 lambda_item 函數(shù)
def lambda_item(n):
return 9 + n
如果整個表達式用 python 代碼來詮釋的話,可以是這樣
fun = []
for i in range(10):
fun.append((lambda n: 9+n))
另一個讓新人迷惑的是
a = [[0]] * 3
a[0].append(1)
print(a)
打印出
[[0,1], [0,1], [0,1]]首先,感謝 @李毅 的回答,他回答的很好。
那么,我們看看這個程序的運行結果是什么?
fun = [(lambda n : i + n) for i in range(10)]
>>> fun
[<function <lambda> at 0x7f032e425668>, <function <lambda> at 0x7f032e4256e0>, <function <lambda> at 0x7f032e425758>, <function <lambda> at 0x7f032e4257d0>, <function <lambda> at 0x7f032e425848>, <function <lambda> at 0x7f032e4258c0>, <function <lambda> at 0x7f032e425938>, <function <lambda> at 0x7f032e4259b0>, <function <lambda> at 0x7f032e425a28>, <function <lambda> at 0x7f032e425aa0>]
>>> len(fun)
>>> 10
從運行的結果可以看出,fun 參數(shù)是一個以函數(shù)對象為元素的列表,列表的長度為 10。其中的長度是由步進函數(shù) range(10) 來決定的。
我們進行往下執(zhí)行。
>>> for f in fun:
... f(1)
...
10
10
10
10
10
10
10
10
10
10
結果出現(xiàn)了“意外”,并不是如想象中的那樣,結果是相同的,沒有步進。
>>> fun = [(lambda n : i + n) for i in range(2)]
>>> fun
[<function <lambda> at 0x7f032e42e050>, <function <lambda> at 0x7f032e42e140>]
>>> fun = [(lambda n : i + n) for i in range(3)] >>> fun
[<function <lambda> at 0x7f032e425668>, <function <lambda> at 0x7f032e4256e0>, <function <lambda> at 0x7f032e425758>]
>>>
從上面的執(zhí)行結果,我們可以明顯的看出,步進函數(shù)決定了 list 的長度,但是這個 list 比較特別的地方是列表的元素是 function 對象,而對于 function 來說,就涉及到參數(shù)的作用域問題,而 function 對象里的 i 參數(shù),明顯是一個全局變量,@Jasoney 說的很好,這個 i 參數(shù)隨著步進函數(shù) range(10) 的迭代,不斷變化,最終確定值為 9 ,那么 function 對象最終可以確定為 lambad n: 9 + n,所以,最終的執(zhí)行結果雖然“奇怪”,但也合乎邏輯。
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產(chǎn)業(yè)為響應國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產(chǎn)業(yè)鏈。利用北京大學優(yōu)質教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經(jīng)驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。