一、定义
python中的闭包从表现形式上定义为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为闭包,这个定义是相对直白的,好理解的。
def demo():
x=10
def demo1(y):
return x+y
return demo1
c=demo()
d=c(6)
print(d)
结合这段简单的代码和定义来说明闭包:
如果在一个内部函数里:demo1(y)就是这个内部函数,
对在外部作用域(但不是在全局作用域)的变量进行引用:x就是被引用的变量,x在外部作用域demo()函数里面,但不在全局作用域里,
则这个内部函数demo1就是一个闭包。
再稍微讲究一点的解释是,闭包=函数块+定义函数时的环境,adder就是函数块,x就是环境,当然这个环境可以有很多,不止一个简单的x。
二、使用闭包注意事项
1、闭包中是不能修改外部作用域的局部变量的
def foo():
m=0
def foo1():
m=1
print(m)
print(m)
foo1()
foo()
输出0、1
从执行结果可以看出,虽然在闭包里面也定义了一个变量m,但是其不会改变外部函数中的局部变量m。
2、以下这段代码是在python中使用闭包时一段经典的错误代码
def fun():
a = 1
def fun1():
a = a + 1
return a
return fun1
result=fun()
data=result()
print(data)
输出:
Traceback (most recent call last):
File "D:\Integrated_platform\vehicle_pool_for_sale_pytest\123.py", line 151, in <module>
data=result()
File "D:\Integrated_platform\vehicle_pool_for_sale_pytest\123.py", line 146, in fun1
a+=1
UnboundLocalError: local variable 'a' referenced before assignment
如果在一个范围内,对一个变量进行赋值,那么这个变量就会被认为是局部变量,就像在func()这个函数范围之内,我们对a这个变量进行了重新赋值:a+=1,那么编译器就会认为a这个变量是一个局部变量,而这个赋值表达式实际上是从右向左进行的,也就是说,在进行a+1运算的时候,a并没有被定义,所以就爆出了这个UnboundLocalError错误。
解决:
def fun():
a=1
def fun1():
nonlocal a
a+=1
return a
return fun1
result=fun()
data=result()
print(data)