系列文章目录

一、函数对象

  • 含义:

    在代码中,一个函数名(不写括号或者其他东西)就代表一个函数对象,如:print,其本质上是函数的引用,里面保存的是函数的内存地址,它可以将一个函数当作变量使用。

  • 作用:

    def foo():
        print('我是foo')
    
    foo  # 这就是一个函数对象
        
    # 函数对象可以赋值给变量
    f = foo
    
    # 赋值后的变量也可以加 () 调用执行
    f()
    
    print(foo)  # 打印:<function foo at 0x00000000070D4670>
    
    # 当作另一个函数的返回值
    def bar():
        return foo
    

二、闭包函数(闭包)

  • 含义:

    若干个函数嵌套,其中:

    • 内层函数可以访问外层函数中定义的变量

    • 外层函数返回内层函数的引用,使内层函数可以被外界调用

    那么这个内层函数就是闭包函数。

    听上去容易让人迷惑,似乎没什么用。别急,它的特点会在后面讲到。

  • 格式:

    在嵌套函数中,外层函数返回内层函数的对象(不一定是两层嵌套,若干层嵌套都可以)。

    def f1():
        x = 1  # 被“包裹”的变量
        def f2():
            pass
        return f2
    
  • 特点:

    • 内层函数永远只访问在外层函数中定义的变量;

    • 外层函数中的变量,不会随着函数的结束而被销毁;

    • 能够避免外层函数中的变量被修改;

    • 会造成内存泄露,外层函数中的变量永远占着内存。

    def f1():
        x = '1111'
        def f2():
            print(x)
        return f2
        
    x = '0000'
    f = f1()  # 将f2的函数引用赋值给f,f1中的变量x会被保留下来
    f()  # 调用f,实际上是调用了f2。打印:1111
    

下一篇