在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python/ 求解釋此python的lambda表達式

求解釋此python的lambda表達式

求教一下表達式各變量是怎么變化的,以及結果,尤其是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]
2018年9月8日 02:48
編輯回答
孤島

n是參數(shù),調用的時候才會傳進來,現(xiàn)在并沒有值

2017年10月30日 21:56
編輯回答
舊酒館

這是 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]]
2017年9月30日 04:23
編輯回答
舊顏

首先,感謝 @李毅 的回答,他回答的很好。

1、初次執(zhí)行

那么,我們看看這個程序的運行結果是什么?

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) 來決定的。

2、繼續(xù)執(zhí)行

我們進行往下執(zhí)行。

>>> for f in fun:
...     f(1)
...
10
10
10
10
10
10
10
10
10
10

結果出現(xiàn)了“意外”,并不是如想象中的那樣,結果是相同的,沒有步進。

3、 修改步進函數(shù)的值

>>> 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í)行結果雖然“奇怪”,但也合乎邏輯。

2018年5月20日 18:59
編輯回答
壞脾滊
# fun = [(lambda n : i + n) for i in range(10)] 等價為
funs = []
tmp = 0
fun = lambda n: tmp + n
for i in range(10):
  funs.append(fun)
  tmp = i
2017年3月3日 15:19