python函数的闭包

时间:2022-07-05 22:48:38

---恢复内容开始---

python允许有内部函数,也就是说可以在函数内部再定义一个函数,这就会产生变量的访问问题,类似与java的内部类,在java里内部类可以直接访问外部类的成员变量和方法,不管是否私有,但外部类需要通过内部类的引用来进行访问。python内部函数和外部函数的成员变量可以相互访问但是不能修改,也就是所谓的闭包。举个例子

 1 def outt():
2 x=10
3 def inn():
4 x+=1
5 return x
6 return inn()
7
8 outt()
9 Traceback (most recent call last):
10 File "<input>", line 1, in <module>
11 File "<input>", line 6, in outt
12 File "<input>", line 4, in inn
13 UnboundLocalError: local variable 'x' referenced before assignment

可以使用nonlocal 关键字修饰外部的成员变量使其可以被修改,具体如下

 1 def outt():
2 x=10
3 def inn():
4 nonlocal x
5 x+=1
6 return x
7 return inn()
8
9 outt()
10 11

对于传的参数外函数和内函数也是闭包的 举例如下

 1 def outt():
2 x=10
3 def inn(y):
4 nonlocal x
5 x+=y
6 return x
7 return inn(y)
8
9 outt()(10)
10 Traceback (most recent call last):
11 File "<input>", line 1, in <module>
12 File "<input>", line 7, in outt
13 NameError: global name 'y' is not defined

但是可以简化写法避免传参问题

 1 def outt():
2 x=10
3 def inn(y):
4 nonlocal x
5 x+=y
6 return x
7 return inn
8
9 outt()(10)
10 20

可以看出外函数调用内函数时没有在括号里传参python可以对他进行默认的赋值操作,这样就避免了参数在两个函数之间的传递问题