7.7 匿�函数�获��值¶
问题¶
ä½ ç”¨lambda定义了一个匿å��函数,并想在定义时æ�•获到æŸ�些å�˜é‡�的值。
解决方案¶
先看下下é�¢ä»£ç �的效果:
>>> x = 10
>>> a = lambda y: x + y
>>> x = 20
>>> b = lambda y: x + y
>>>
çŽ°åœ¨æˆ‘é—®ä½ ï¼Œa(10)å’Œb(10)è¿”å›žçš„ç»“æžœæ˜¯ä»€ä¹ˆï¼Ÿå¦‚æžœä½ è®¤ä¸ºç»“æžœæ˜¯20å’Œ30ï¼Œé‚£ä¹ˆä½ å°±é”™äº†ï¼š
>>> a(10)
30
>>> b(10)
30
>>>
这其ä¸çš„奥妙在于lambda表达å¼�ä¸çš„x是一个自由å�˜é‡�, 在è¿�行时绑定值,而ä¸�是定义时就绑定,这跟函数的默认值å�‚数定义是ä¸�å�Œçš„。 å› æ¤ï¼Œåœ¨è°ƒç”¨è¿™ä¸ªlambda表达å¼�的时候,x的值是执行时的值。例如:
>>> x = 15
>>> a(10)
25
>>> x = 3
>>> a(10)
13
>>>
å¦‚æžœä½ æƒ³è®©æŸ�个匿å��函数在定义时就æ�•获到值,å�¯ä»¥å°†é‚£ä¸ªå�‚数值定义æˆ�默认å�‚æ•°å�³å�¯ï¼Œå°±åƒ�下é�¢è¿™æ ·ï¼š
>>> x = 10
>>> a = lambda y, x=x: x + y
>>> x = 20
>>> b = lambda y, x=x: x + y
>>> a(10)
20
>>> b(10)
30
>>>
讨论¶
在这里列出æ�¥çš„问题是新手很容易犯的错误,有些新手å�¯èƒ½ä¼šä¸�æ�°å½“的使用lambda表达å¼�。 比如,通过在一个循环或列表推导ä¸åˆ›å»ºä¸€ä¸ªlambda表达å¼�列表,并期望函数能在定义时就记ä½�æ¯�次的è¿ä»£å€¼ã€‚例如:
>>> funcs = [lambda x: x+n for n in range(5)]
>>> for f in funcs:
... print(f(0))
...
4
4
4
4
4
>>>
但是实际效果是è¿�行是n的值为è¿ä»£çš„æœ€å�Žä¸€ä¸ªå€¼ã€‚现在我们用å�¦ä¸€ç§�æ–¹å¼�修改一下:
>>> funcs = [lambda x, n=n: x+n for n in range(5)]
>>> for f in funcs:
... print(f(0))
...
0
1
2
3
4
>>>
通过使用函数默认值�数形�,lambda函数在定义时就能绑定到值。