python闭包实现的所谓bug
时间:2010-12-15
来源:互联网
转:stonelee
思路来自http://groups.google.com/group/p ... 6303de2ec?hl=zh-CN#
整理记录下来,让墙内的人也看看。
问题描述
Python代码
复制代码
结果为:
[13, 13, 13, 13, 13, 13, 13, 13, 13, 13]
[145743064, 145743064, 145743064, 145743064, 145743064, 145743064, 145743064, 14
5743064, 145743064, 145743064]
很奇怪的结果吧。
问题所在:
Python代码
复制代码
结果为
locals: {'n': 4}
i in globals is: True
可以看到i根本就没有封闭在f()里,而是个全局变量,因此出现上面的结果也就不奇怪了。
解决方案:
Python代码
复制代码
将全局变量i引入f中,这下结果正确了。
[4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
[143334724, 143334712, 143334700, 143334688, 143334676, 143334664, 143334652, 14
3334640, 143334628, 143334616]
思路来自http://groups.google.com/group/p ... 6303de2ec?hl=zh-CN#
整理记录下来,让墙内的人也看看。
问题描述
Python代码
- fs = []
- for i in range(10):
- def f(n):
- return i + n
- fs.append(f)
- print [f(4) for f in fs]
- print [id(f(4)) for f in fs]
[13, 13, 13, 13, 13, 13, 13, 13, 13, 13]
[145743064, 145743064, 145743064, 145743064, 145743064, 145743064, 145743064, 14
5743064, 145743064, 145743064]
很奇怪的结果吧。
问题所在:
Python代码
- fs = []
- for i in range(10):
- def f(n):
- print locals()
- print 'i' in globals()
- return i + n
- fs.append(f)
- print [f(4) for f in fs]
- print [id(f(4)) for f in fs]
locals: {'n': 4}
i in globals is: True
可以看到i根本就没有封闭在f()里,而是个全局变量,因此出现上面的结果也就不奇怪了。
解决方案:
Python代码
- fs = []
- for i in range(10):
- def f(n,i = i):
- return i + n
- fs.append(f)
- print [f(4) for f in fs]
- print [id(f(4)) for f in fs]
[4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
[143334724, 143334712, 143334700, 143334688, 143334676, 143334664, 143334652, 14
3334640, 143334628, 143334616]
作者: 中关村村草 发布时间: 2010-12-15
这次没有猜到是你,唉,失败~~
先留言,再看~
先留言,再看~
作者: icyomik 发布时间: 2010-12-15
表示谢谢,完全明解~

作者: icyomik 发布时间: 2010-12-15
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28