闭包函数
* 函数对象:可以将定义在函数内的函数返回到全局使用,从而打破函数的层级限制。
* 名称空间与作用域:作用域关系在函数定义阶段时就已经固定死了。与调用位置无关,即在任意位置调用函数都需要跑到定义函数时找到作用域关系
def f1(): x = 1 def inner(): print(x) return inner func = f1() x = 2 def f2(): x = 3 func() f2()
outputs
1
闭包:闭是封闭(函数内部函数),包是包含(该内部函数对外部作用域而非全局作用域的变量的引用)。闭包指的是:函数内部函数对外部作用域而非全局作用域的变量的引用。
提示:之前外面都是通过参数将外部的值传给函数,闭包提供了另一种思路,包起来喽,包起呦,包起来哇。
def outter(): x = 1 def inner(): print(x) return inner f = outter() def f2(): x = 2 f() f2()
outputs
1
为函数传参的方式二:包给函数
先定义一个有参函数,在这个有参函数内定义一个无参函数,然后在无参函数内写入需要的代码块,然后返回无参函数的函数名,这样就可以在函数外部,将有参函数赋值给变量名的方式来进行多次调用。
def outter(x): x = 1 def inner(): print(x) return inner f = outter(6) f() f() # 查看闭包的元素 print(f"f.__closure__[0].cell_contents:{f.__closure__[0].cell_contents}")
Outputs
macname@MacdeMacBook-Pro py % python3 cccccc.py 1 1 f.__closure__[0].cell_contents:1 macname@MacdeMacBook-Pro py %