四十.python中的闭包

本文介绍了Python闭包,它是一种组织代码的结构,可减少代码复用性。构建外部函数时,内部函数使用外部函数变量,外部函数返回内部函数方法。内部函数无法直接修改外部函数变量值,在Python 2.7中可将闭包变量改成可变类型修改。闭包常用于装饰器和实现面向对象编程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

闭包是什么东西?

闭包是一种组织代码的结构,它同样可以减少代码的复用性。

简单的可以理解为:构建一个(外部)函数时,在该函数内又有一个(内部)函数,内部函数需要使用到外部函数的变量,且外部函数返回的值则是内部函数的方法。

以下通过示例来理解闭包的意思:

#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.闭包也是实现面向对象的编程方法之一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值