博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python匿名函数捕获变量值的一些问题
阅读量:3935 次
发布时间:2019-05-23

本文共 882 字,大约阅读时间需要 2 分钟。

转载自python cookbook

文章目录

匿名函数捕获变量值的一些问题

问题

你用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))...44444

但是实际效果是运行是n的值为迭代的最后一个值。现在我们用另一种方式修改一下:

>>> funcs = [lambda x, n=n: x+n for n in range(5)]>>> for f in funcs:... print(f(0))...01234

通过使用函数默认值参数形式,lambda函数在定义时就能绑定到值。

你可能感兴趣的文章
gemfire的简单了解
查看>>
pom配置之:<distributionManagement>snapshot快照库和release发布库
查看>>
Hystrix仪表盘--Unable to connect to Command Metric Stream
查看>>
文本入库特殊字符处理, 防止SQL注入
查看>>
微信公众号开发的几点总结
查看>>
spring-restdocs利用测试用例生成API文档,AsciidocFX工具整合
查看>>
秒杀抢购开发总结
查看>>
config-client读取不到application中配置的config-server地址
查看>>
抓包工具Fiddler对iPhone进行抓包
查看>>
服务发现比较:Consul vs Zookeeper vs Etcd vs Eureka
查看>>
【Fiddler】改写返回数据功能(断点,autoReponse)
查看>>
微信多客户端导致重复调用服务接口问题
查看>>
service层@Transactional事务控制使用以及注意
查看>>
数据降维的几种方法(转)
查看>>
三条命令解决Git 如何删除远程服务器文件同时保留本地文件
查看>>
cloud项目中org.springframework.beans.factory.NoSuchBeanDefinitionException
查看>>
redis,java释放资源正确方式,防止redis因resource的异常
查看>>
初识图形数据库--neo4j
查看>>
Spring boot @Value的值取不到
查看>>
使用Mapstruct来进行domain实体与Entity模型之间的映射操作,减少类之间代码转化
查看>>