Loading

python闭包

闭包概念:
内部函数对外部函数作用域里变量的引用
函数内的属性,都是有生命周期的,都是在函数执行期间
闭包可以让一个变量长期在内存中不被释放
 
内部函数的生命周期
def func():  # 外部函数
    print('this is func.')

    def in_func():  # 内部函数
        print('this is in_func.')


func() # this is func.
'''
运行外部函数(func),内部函数(in_func)就被创建了
创建过程在外部函数的执行过程中
函数内的属性,都是有生命周期的,都是在函数执行期间
执行func函数,只会输出func的输出,并不会执行in_func
因为in_func在func执行过程中创建了,但是并没有被调用
'''
闭包函数
'''
    如果我们想在其他地方调用内部函数
    我们可以将内部函数对象返回给外部函数,然后实例外部函数
    '''
    def func():  # 外部函数
        print('this is func.')
    
        def in_func():  # 内部函数
            print('this is in_func.')
        return in_func #内部函数对象返回给外部函数
    var = func() # func接收了返回的in_func object
    var() #实例var   也就是 in_func() 就调用到了内部函数
    
    '''
    如果不将内部函数返回给外部函数
    可以直接在func 内 调用 in_func()输出内部函数的内容
    当func()执行结束,in_func被销毁
    '''
def func():  # 外部函数
    a = 1  # 设定外部变量a = 1

    def in_func(number):  # 内部函数
        print( a+=number)  #

    return in_func


var = func()
var(1)
'''
上述代码,func函数变量a,在函数外部不能使用,a的作用域是func的整个函数
定义内部函数in_func,in_func也是func的作用域内
我们可以使用内部函数完成对外部变量的引用
因为我们将in_func 使用a变量,in_func赋值给var实例,var存在所以a没有销毁
del var 之后 a变量销毁无法使用
'''
# 内部函数就是闭包函数,闭包函数私有化了变量完成数据封装
示例
my_list = [1, 2, 3, 4, 5]


def func(obj):
    print('func:', obj)

    def func1():
        obj[0] += 1
        print('func1:', obj)

    return func1


var = func(my_list) # func: [1, 2, 3, 4, 5]

var()  # func1: [2, 2, 3, 4, 5]
var()  # func1: [3, 2, 3, 4, 5]
var()  # func1: [4, 2, 3, 4, 5]
 

posted @ 2022-08-25 10:24  木子七  阅读(42)  评论(0编辑  收藏  举报