闭包 = 一个函数 + 外部封闭的作用域
闭包函数的特征:
def funcB1(): x = 100 def funcB2(): c = x * 2 print(c) return funcB2 # 调用闭包函数 返回的结果就是一个闭包 # 闭包 = 一个函数 + 外部封闭作用域 # 封闭作用域的值在外面是没有办法进行修改的 res = funcB1() print(res) res() # 运行结果 # <function funcB1.<locals>.funcB2 at 0x000001B8B48BC310> # 200
因为作用域的原因,在函数外部就无法拿到函数中的变量和内部函数。通常我们需要使用函数中的变量时,才去将变量返回的办法。同理,在使用内部函数时,我们也可以将函数名作为返回值返回。 这是闭包最常用的方式。
函数名__closure__ 在函数是闭包函数时,返回一个cell元素;不是闭包时,返回None。
输出cell:
def funcB1(): x = 100 def funcB2(): c = x * 2 print(c) print(funcB2.__closure__) return funcB2 # 调用闭包函数 返回的结果就是一个闭包 # 闭包 = 一个函数 + 外部封闭作用域 # 封闭作用域的值在外面是没有办法进行修改的 res = funcB1() res() # (<cell at 0x0000027678A1C640: function object at 0x0000027678A0C310>, <cell at 0x0000027678A1CB50: int object at 0x00000276782655D0>)
输出None:
name = 'python' def func(): def inner(): print(name) print(inner.__closure__) # None return inner f = func() f() # None # python