作者pshuang (中山先生忠实信徒-我爱萝)
看板Python
标题[问题] lambda 在回圈内设定的问题
时间Mon Mar 28 11:22:12 2022
Os环境:Win7
Py版本: 3.8.10
lambda关键字,如果在回圈内设定,又没带参数,
感觉结果想不通。想请问原因。
code如下:
#--------------------无参数-----------------------
l_l = [ lambda: print(i) for i in range(3) ]
for l in l_l: l()
输出结果:
2
2
2
#--------------------带参数---------------------
l_l2 = [ lambda x = i: print(x) for i in range(3) ]
for l in l_l2: l()
输出结果:
0
1
2
请问,没带参数的场合,每次回圈还是把当下的 i 传给 print 不是吗?
为甚麽输出结果却都是回圈的最後一个值呢?
这是lambda的某种特性吗?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.243.121.200 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1648437735.A.C3E.html
1F:推 DaOppaiLoli: 这应该是 Scope 的关系 03/28 12:54
3F:→ DaOppaiLoli: 就算写成一般 Function 也会有一样的情况,i 对 lam 03/28 12:56
4F:→ DaOppaiLoli: bda 来说是 Global 但 x 对 lambda 来说是 Local 03/28 12:56
原来如此,感谢。
5F:→ ck574b027: python是用reference(简称位置)在运作的,你说的「 03/28 23:37
6F:→ ck574b027: 当下的i」只是i的位置。又因python改变位置需要透过as 03/28 23:37
7F:→ ck574b027: signment,而i在for并没有发生这种事,只是在他的位 03/28 23:37
8F:→ ck574b027: 置更新,所以全部lambda都拿着同个i。你可以不要用lis 03/28 23:37
9F:→ ck574b027: t comprehension,把第一个例子的[]改成(),结果就会 03/28 23:37
10F:→ ck574b027: 跟第二个一样,因为generator等於在for才建立lambda 03/28 23:37
11F:推 poototo: generator也是闭包把local的i让lambda记住才yield出去 03/29 00:19
12F:推 poototo: []的例子类似js回圈的var会共用污染 03/29 01:05
13F:→ poototo: 也就是ck大所说的,都去同一addr取值 03/29 01:06
是的,看了Da大给的范例想通了。
透过把变数指向的位址印出来证实。
https://www.ideone.com/T4bUMs
python在改动变数(reference)指向的值时,
会产生一个新物件,并把新物件的位址更新到原变数。
※ 编辑: pshuang (111.243.112.208 台湾), 03/29/2022 09:01:34