闭包函数

来源:互联网 发布:伦敦金数据网 编辑:程序博客网 时间:2024/06/02 06:59
  • 定义:函数内部定义的函数,该函数包含对外部作用域,而不是对全局作用域的应用。
    name = 'seb'def func():    name = 'ayhan'    def my_name():   # 函数my_name定义在函数func内部,包含了对外部作用域(上一层) name = 'ayhan'的引用        print('我的名字',name)    # 相当于函数外包了一层外部作用域(上一层,但不是全局)的关系。    return my_namefunc()  # 执行函数,返回my_name函数的内存地址b = func()   # 定义全局变量b,指向my_name这个内部函数,使其可以处处被调用print(b)  # 打印出my_name函数的内存地址b()  # 执行b(),就相当于执行了my_name这个函数,def func2():    name = 'tom'    b() #  调用b这个函数(相当于调用了my_name函数)name = 'ronin' # 修改name全局变量func2() # 打印结果仍然不变,始终从函数的定义处的上一层来找到 name= 'ayhan'# 即包含对外部作用域,而不是对全局作用域的引用。因此my_name是一个闭包函数运行结果:<function func.<locals>.my_name at 0x000001E8B7BFEA60>我的名字 ayhan我的名字 ayhan查看函数是否是闭包函数:
    print(b.__closure__)
    (<cell at 0x000001E8B5CA0C48: str object at 0x000001E8B7BFBA78>,)
  • 特点:
    • 自带作用域,只找本体外面包的那一层(或再上一层),就是不到全局作用域。
    • 延迟计算(惰性计算),只拿到了函数的内存地址,加()才执行
    • 原本只在函数内部定义和执行的函数,实现全局调用,注意:
      函数的作用域关系在函数定义阶段就已经固定,与调用位置无关,无论函数在何处调用,都需要回到定义阶段去找对应的作用域关系。
    • 闭包函数和return的关系:
      不return一样符合闭包函数的定义,但是只能在函数内部使用,不能全局引用,因此闭包函数通常和return一起用。
    • 基本形式:
      def 外部函数():    内部函数需要的变量    def 内部函数():        引用外部变量    return 内部函数