在匿名函数中绑定变量的值

1.问题

我们利用lambda表达式定义了一个匿名函数,希望在函数定义的时候完成对变量名的绑定

2.解决方案

考虑以下的代码:

In [1]: x = 10

In [2]: a = lambda y : x + y

In [3]: x = 20

In [4]: b = lambda y : x + y

In [5]: a(10)
Out[5]: 30

In [6]: b(10)
Out[6]: 30

这里的问题在于lambda中的x变量是一个全局变量,在运行时才进行绑定,而不是定义的时候绑定,因此,lambda表达式中的x的值应该是执行时确定的

In [7]: x = 30

In [8]: a(10)
Out[8]: 40

如果希望匿名函数可以在定义的时候绑定变量,并保持值不变,那么可以将那个值作为默认参数来实现:

In [13]: x = 10

In [14]: c = lambda y ,x = x : y + x

In [15]: x = 20

In [16]: d = lambda y ,x = x : x + y

In [17]: c(10)
Out[17]: 20

In [18]: d(10)
Out[18]: 30
3.总结

这个问题比较容易出现在通过列表推导式创建一列lambda表达式,户或者在一个循环中期望lambda表达式能够用在定义的时候记住迭代变量
示例如下:

In [19]: listlambda = [lambda x : x+n for n in range(5)]

In [20]: for i in listlambda:
    ...:     print(i(1))
    ...:     
5
5
5
5
5

可以注意到所有的函数都认为n为4,也就是for循环迭代的最后一个值

In [22]: newlistlambda = [lambda x, n = n: x+n for n in range(5)]

In [23]: for f in newlistlambda:
    ...:     print(f(1))
    ...:     
1
2
3
4
5

可以看到,现在函数在定义的时候捕获到n的值了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值