python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。
以下说明主要针对 python2.7,其他版本可能存在差异。
也许直接看定义并不太能明白,下面我们先来看一下什么叫做内部函数:
def wai_hanshu(canshu_1):
def nei_hanshu(canshu_2): # 我在函数内部有定义了一个函数
return canshu_1*canshu_2
return nei_hanshu # 我将内部函数返回出去
a = wai_hanshu(123) # 此时 canshu_1 = 123
print a
print a(321) # canshu_2 = 321
执行结果:
0x2B61270>
642
我在函数里面有嵌套了一个函数,当我向外层函数传递一变量的之后,并赋值给 a ,我们发现 a 变成了一个函数对象,而我再次为这个函数对象传参的时候,又获得了内部函数的返回值。我们知道,按照作用域的原则来说,我们在全局作用域是不能访问局部作用域的。但是,这里通过讨巧的方法访问到了内部函数。。
下面我们继续看一个例子:
a = []
def nei_hanshu(canshu):
a.append(canshu)
return a
return nei_hanshu
a = wai_hanshu()
print a(123)
print a(321)
执行结果:
[123]
[123, 321]
可以看出函数位于外部函数中的列表 a 竟然改变了。要知道为什么,就要先知道什么是python的命名空间,而命名空间就是作用域表现的原因,这里我简要说明一下。
引入命名空间的主要原因还是为了避免变量冲突,因为python中的模块众多,模块中又有函数,类等,它们都要使用到变量。但如果每次都要注意不和其他变量名冲突,那就太麻烦了,开发人员应该专注于自己的问题,而不是考虑别人写的程序中用到了什么变量,所以python引入了命名空间。命名空间分为模块层,模块内又分为全局作用域和局部作用域,用一个图来表示的话:
未完
http://www.jb51.net/article/86383.htm