闭包是什么东西?
闭包是一种组织代码的结构,它同样可以减少代码的复用性。
简单的可以理解为:构建一个(外部)函数时,在该函数内又有一个(内部)函数,内部函数需要使用到外部函数的变量,且外部函数返回的值则是内部函数的方法。
以下通过示例来理解闭包的意思:
#coding:utf-8
def outer(a):#定义一个outer外部函数,a是一个必传参数
b = 5 #外部函数的变量
def inner():#内部函数,没有参数
print a+b #内部函数的语句
return inner #外部函数返回值时内部函数的方法
if __name__=="__main__": #加入这句后,在其他模块调用时不执行以下执行语句
c = outer(5)#调用外部函数传入参数5,这个时候外部函数存在两个参数一个a=5,另一个b=10
#外部函数结束的时候会发现内部函数引用了自己的变量,因此这两个变量不会释放,会绑定给内部函数
c() #c存了外部函数的返回值,也就是inner内部函数的方法,这里相当于执行inner内部函数
#内部函数方法为print a+b 则打印结果为10
d = outer(10)
d() #结果为15
内部函数的方法是无法直接修改外部函数的变量值。
你可以尝试把以上代码的print a+b 改为 a+=1 然后print a试试,它是会报错的。UnboundLocalError: local variable 'a' referenced before assignment 运行时会报这样的错误,也就是说明a这个外部函数的变量值无法直接修改。
那么在内部函数若要修改在python2.7中需要把闭包(外部函数)变量改成可变类型数据进行修改,比如把变量变成一个列表。
以下为修改外部函数的示例:
#coding:utf-8
def outer(a):#定义一个outer外部函数,a是一个必传参数
b = 5 #外部函数的变量
e = [a] #把传入的参数以列表的形式保存在变量名e里面
def inner():#内部函数,没有参数
e[0]+=1 #e的下标索引为0的时候就是传入的a值,a+=1则为a=a+1
print a+b
print e[0] #打印a+1后的下标索引值
return inner #外部函数返回值时内部函数的方法
if __name__=="__main__": #加入这句后,在其他模块调用时不执行以下执行语句
c = outer(5)#调用外部函数传入参数5,这个时候外部函数存在两个参数一个a=5,另一个b=10
#外部函数结束的时候会发现内部函数引用了自己的变量,因此这两个变量不会释放,会绑定给内部函数
c() #c存了外部函数的返回值,也就是inner内部函数的方法,这里相当于执行inner内部函数
#内部函数方法为print a+b 则打印结果为10,print e[0]为5+1 则打印6
d = outer(10)
d() #结果为15,11
闭包一般是在哪几种情况下使用:
1.装饰器,也就是当我们需要在原来的函数上进行功能添加又不去改变原来函数的结构时可以使用闭包的方法去实现。
2.闭包也是实现面向对象的编程方法之一。