lambda引出的问题
2015-09-10 13:52
155 查看
一个QQ群里有个人问了一个问题,问题如下:
问你 一个python问题:
list1 = [ lambda x : x * i for i in range(4) ]
print [ m(2) for m in list1]
为啥打印出的是【6 6 6 6】,而不是【0 2 4 6】?
我感觉,list1元素是四个函数,
第一个函数返回 x*0
第二个函数返回 x*1
第三个函数返回 x*2
第四个函数返回 x*3
然后把x换成2,结果应该是:【0 2 4 6】
奇怪啊,为啥结果全是6?
**************************华丽的分割线********************************
这个问题乍一看好像结果应该是[0,2,4,6],但是一执行你会发现结果不对。
这个问题的可以这么来分析:
list1 = [ lambda x : x * i for i in range(4) ]
这个其实根据操作符优先级,其实是这样的list1 = [ (lambda x : x * i) for i in range(4) ]
执行后是得到一个列表,包含4个函数地址的列表
关键是i变量,因为是临时变量,所以最终生成的列表中的函数里的i都是最后一次执行的值,那就是3.
所以这边一分析,那么就可以把这个列表写成这样:
[lambda x : x * 3,lambda x : x * 3,lambda x : x * 3,lambda x : x * 3]
所以最后m(2)执行的时候,结果是[6,6,6,6].
这个用临时变量来生成函数或者类等时候需要注意这一点。
问你 一个python问题:
list1 = [ lambda x : x * i for i in range(4) ]
print [ m(2) for m in list1]
为啥打印出的是【6 6 6 6】,而不是【0 2 4 6】?
我感觉,list1元素是四个函数,
第一个函数返回 x*0
第二个函数返回 x*1
第三个函数返回 x*2
第四个函数返回 x*3
然后把x换成2,结果应该是:【0 2 4 6】
奇怪啊,为啥结果全是6?
**************************华丽的分割线********************************
这个问题乍一看好像结果应该是[0,2,4,6],但是一执行你会发现结果不对。
这个问题的可以这么来分析:
list1 = [ lambda x : x * i for i in range(4) ]
这个其实根据操作符优先级,其实是这样的list1 = [ (lambda x : x * i) for i in range(4) ]
执行后是得到一个列表,包含4个函数地址的列表
关键是i变量,因为是临时变量,所以最终生成的列表中的函数里的i都是最后一次执行的值,那就是3.
所以这边一分析,那么就可以把这个列表写成这样:
[lambda x : x * 3,lambda x : x * 3,lambda x : x * 3,lambda x : x * 3]
所以最后m(2)执行的时候,结果是[6,6,6,6].
这个用临时变量来生成函数或者类等时候需要注意这一点。
相关文章推荐
- charles代理的使用
- 【原创】如何编写udev规则实现特定usb口设备创建指定的设备文件名?
- HashMap深度解析(一)
- oracle 查看锁表情况并处理锁表
- selenium + python自动化测试环境搭建
- vbs自动登录telnet并发送指定命令
- request与session区别
- 苹果发数款新品:25日iPhone 6s开售5288起
- Java web添加log4j
- Cygwin
- 【bzoj1406】 AHOI2007密码箱 数论
- 搭建ssh框架报错
- Spring mvc注解详解
- Linux下C/C++ 目录和文件操作
- 1 Two Sum
- Android 各层中日志打印功能的应用
- UBuntu经常使用的操作(网络资源)
- iptables nat 测试
- 计算G711语音的打包长度和RTP里timestamp的增长量
- rk3188 双屏异显分析