关于Python的闭包和后期绑定
看到Python程序员的10个常见错误这篇文章中讲到了闭包和后期绑定的问题。
有很多不同的人都对闭包过进行了定义:
1、是引用了自由变量的函数。这个函数通常被定义在另一个外部函数中,并且引用了外部函数中的变量。 — <<wikipedia>>
2、是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。- <<Java编程思想>>
3、是一个匿名的代码块,可以接受参数,并返回一个返回值,也可以引用和使用在它周围的,可见域中定义的变量。- Groovy ['ɡru:vi]
4、是一个表达式,它具有自由变量及邦定这些变量的上下文环境。
5、闭包允许你将一些行为封装,将它像一个对象一样传来递去,而且它依然能够访问到原来第一次声明时的上下文。
6、是指拥有多个变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
7、闭包是可以包含自由(未绑定)变量的代码块;这些变量不是在这个代码块或者任何全局上下文中定义的,而是在定义代码块的环境中定义。
取第4和5的解释。闭包是一个整体,包含了绑定变量和自由变量,绑定变量在函数对象被调用时,以参数的形式传入。而内部的自由变量则会持久化,在多次调用时,该变量的值会累积上一次的结果。
下面这个例子就是用来说明这两个概念:
def create_multipliers():
return [lambda x : i * x for i in range(5)]
for multiplier in create_multipliers():
print multiplier(2)这里定义了一个lambda表达式,create_multipliers()返回的是一个函数对象序列。表面上看,函数中的每一个对象中的i值是不一样的,但是当实际输入x的值进行函数调用时,i的值都是一样的,都是最后一次i的值。因为延迟绑定的特性,即直到函数调用时,函数内部的执行内容才被确定,而此时i值在产生序列时,最终被赋值为4了,因此每一个函数调用中的上下文的i都是4,而不是预期的递增变化的。闭包和延迟绑定一起导致了这里的输出结果不是预期的0、2、4、6、8序列。
建议继续学习:
- 配置Nginx+uwsgi更方便地部署python应用 (阅读:106243)
- 如何成为Python高手 (阅读:54349)
- python实现自动登录discuz论坛 (阅读:32306)
- python编程细节──遍历dict的两种方法比较 (阅读:19773)
- 每个程序员都应该学习使用Python或Ruby (阅读:17298)
- 30分钟3300%性能提升――python+memcached网页优化小记 (阅读:13111)
- 使用python爬虫抓站的一些技巧总结:进阶篇 (阅读:12756)
- 我的PHP,Python和Ruby之路 (阅读:12613)
- Python处理MP3的歌词和图片 (阅读:9120)
- 关于使用python开发web应用的几个库总结 (阅读:8106)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:童燕群 来源: 忘我的追寻
- 标签: Python 绑定 闭包
- 发布时间:2014-11-30 23:19:01
-
[928] WordPress插件开发 -- 在插件使用 -
[134] 解决 nginx 反向代理网页首尾出现神秘字 -
[53] 整理了一份招PHP高级工程师的面试题 -
[52] 如何保证一个程序在单台服务器上只有唯一实例( -
[51] 海量小文件存储 -
[51] 用 Jquery 模拟 select -
[50] 全站换域名时利用nginx和javascri -
[50] Innodb分表太多或者表分区太多,会导致内 -
[49] CloudSMS:免费匿名的云短信 -
[47] jQuery性能优化指南
