美文网首页
python_理解篇_闭包咋理解?

python_理解篇_闭包咋理解?

作者: 金鱼座 | 来源:发表于2019-10-17 11:08 被阅读0次

大家好,我是金鱼座,一个走在测试领域这片蓝海中, 蹉跎前行的技术渣渣,唯有一直走下去,也许能改变点什么,加油!

前面有一篇文件介绍了日常常用的装饰器的实现, 可是为什么会有装饰器这种这么看着高大上的东西呢?
答案就是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()
image.png

提示的错误是a += 1 中找不到,说明无法正常获取到上述的外部函数a变量,为什么?(我也不太理解),怎么解决?(示例中将nonlocal a注释取消执行即可)

此处我想和各位分享下我在了解闭包执行的时候犯下的一个理解错误


在我执行如上的同样的代码,但是没有执行a()这个时,我的idle没有任何报错信息,但是编辑器中的a下划线提示了错误,这是为什么呢?可能有些童鞋已经知道,因为我们在调用
outer()的时候,他实际返回的时inner,而按照闭包定义,他是一个内函数的引用,所以他返回的是:
image.png
说明此时并没有执行内函数,所以并没有报错
只要在下面在执行outer()返回的引用,a()就可以执行到内部函数中去

如果想了解更加详细的话,推荐一个我看的博客https://blog.csdn.net/u013380694/article/details/90019571

相关文章

  • python_理解篇_闭包咋理解?

    大家好,我是金鱼座,一个走在测试领域这片蓝海中, 蹉跎前行的技术渣渣,唯有一直走下去,也许能改变点什么,加油! 前...

  • js作用域链

    之前写过一篇JavaScript 闭包究竟是什么的文章理解闭包,觉得写得很清晰,可以简单理解闭包产生原因,但看评论...

  • 闭包理解

    这次我发现了个奇怪的问题,高程经典的闭包陷阱,竟然是把一个未执行的函数赋值给了一个数组项,当年的我太年轻,竟然没看...

  • 理解闭包

    什么是「闭包」。 「闭包」的作用是什么。在一个立即执行函数当中: 首先,假设以上几行代码运行在立即执行函数当中,那...

  • 理解闭包

    什么是闭包?闭包是什么时候创建的?能不能看到闭包?从这三点出发学习。 在维基百科中的闭包:词法闭包的简称。是引用了...

  • 理解闭包

    spark 比较难得一个事情之一就是当在集群上执行代码的时候,变量和方法的范围和生命周期。Rdds 的操作 能够修...

  • 理解闭包

    欢迎移步我的博客阅读:《理解闭包》 闭包 是指可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码...

  • 理解闭包

    理解闭包 1.闭包概念(出自JavaScript高级程序设计)闭包是指有权访问另一个函数作用域中的变量的函数主谓宾...

  • 理解闭包

    理解闭包 红宝书是这样定义闭包的:是指有权访问 另一个函数作用域中的变量 的 函数。所以闭包首先是一个函数,特殊的...

  • 理解闭包

    闭包 原文链接:http://wwsun.github.io/posts/javascript-closure.h...

网友评论

      本文标题:python_理解篇_闭包咋理解?

      本文链接:https://www.haomeiwen.com/subject/hgmsyctx.html