大家好,我是金鱼座,一个走在测试领域这片蓝海中, 蹉跎前行的技术渣渣,唯有一直走下去,也许能改变点什么,加油!
前面有一篇文件介绍了日常常用的装饰器的实现, 可是为什么会有装饰器这种这么看着高大上的东西呢?
答案就是python中的闭包,因为有了它,才能有了装饰器的发展
那么什么是闭包?
他不是根据我们日常的理解所说的关着的包裹, 那么在python中闭包如何界定?
1 在一个外函数中定义了一个内函数。
2 内函数里运用了外函数的临时变量。
3 并且外函数的返回值是内函数的引用。
可以说满足上面的三个条件就可以说是一个闭包
示例:
def out():
a = 0
def inner(): 内函数
print(a) 调用外函数临时变量
return inner 返回内函数引用
示例中满足,一个外函数和内函数结构,满足外函数临时变量被内函数使用,也满足外函数返回值是内函数的引用,所以他就就是一个最简单的闭包
上面说的是一种最简单的闭包,那么如果说内函数想改变外函数的临时变量值怎么办?,别急,看下面的示例:
如果按照上面的进行改动是否可行呢?
def outer():
print('out1')
a = 0
def inner():
# nonlocal a
print(2)
a += 1
print(a)
print('out2')
return inner
a = outer()
print(a)
a()
提示的错误是a += 1 中找不到,说明无法正常获取到上述的外部函数a变量,为什么?(我也不太理解),怎么解决?(示例中将nonlocal a注释取消执行即可)
此处我想和各位分享下我在了解闭包执行的时候犯下的一个理解错误
在我执行如上的同样的代码,但是没有执行a()这个时,我的idle没有任何报错信息,但是编辑器中的a下划线提示了错误,这是为什么呢?可能有些童鞋已经知道,因为我们在调用
outer()的时候,他实际返回的时inner,而按照闭包定义,他是一个内函数的引用,所以他返回的是:
说明此时并没有执行内函数,所以并没有报错
只要在下面在执行outer()返回的引用,a()就可以执行到内部函数中去
如果想了解更加详细的话,推荐一个我看的博客https://blog.csdn.net/u013380694/article/details/90019571