前言
本章将会讲解Python编程函数的闭包。
一.闭包
1.什么是闭包
当我们在外部函数中定义了一个内部函数,并且内部函数能够读取到外部函数内的变量,这种函数我们就称为闭包。
前景引入:
def test_one(): print("---1---") #test_one() #函数的调用 t_o = test_one() print(id(test_one())) #140726006127832 print(id(t_o)) #t_o变量指向了test_one函数的调用 140726006127832 # t_o() 报错
2.闭包的定义需要满足以下三个条件:
- 在一个外函数中定义了一个内函数
- 内函数里运用了外函数的临时变量
- 并且外函数的返回值是内函数的引用
def test(number): #number 形参 临时变量 print("--1--") def test_in(number_in): print(number_in) print("--2--") return number_in + number print("--3--") return test_in #执行完毕时 结果--1-- --3-- 并且函数里面的变量会被释放(number) res = test(20) #res = test_in res1 = res(25) #test in() print(res1) #45 说明在外层函数执行完毕时,number并没有被释放,而是继续给内层函数使用。
从上自下执行,碰到test(20)执行test里面内容输出--1-- 再向下执行输出--3--,返回test_in检测到了还有内层函数,将test_in返回时将临时变量与内层函数进行了绑定,绑定后继续向下执行返回到函数调用处res ,res相当于test_in ,我们想调用内层函数使用res进行调用执行res1=res(25) 输出了25 输出了--2--,使用到了number,从而证明产生了闭包。
总结:
- 闭包它是一种现象
- 一般情况下,外函数执行完毕时,临时变量会被释放。
- 但此时,外函数发现自己的临时变量会在将来被使用,
- 所以外函数结束的时候,在返回内函数引用的同时,将外函数的临时变量与内函数进行绑定。
- 这也是为什么当外函数结束,但内函数仍然可以使用外函数临时变量的原因。