漫谈Python 闭包

作者:黄哥
链接:https://zhuanlan.zhihu.com/p/21680710
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。

在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。运行时,一旦外部的 函数被执行,一个闭包就形成了,闭包中包含了内部函数的代码,以及所需外部函数中的变量的引用。其中所引用的变量称作上值(upvalue)。

Python 中通俗一点来说,如果在一个函数内部,嵌套了函数,这个内部函数对(非全局作用域)外部作用域的变量进行引用,那么这个内部函数称为闭包。闭包每次运行是能记住引用的外部作用域的变量的值。

理解下面这个代码,函数返回值为函数,Python 函数为第一类对象,可以赋值给变量,可以作为参数传递,可以从函数中返回。

被返回的函数为闭包。nonlocal 为Python 3的语法,表示非局部变量。

下面的代码,是回答这个zhihu.com/question/4873 问题。

# coding:utf-8


def foo():
    x = 5

    def inner():
        nonlocal x
        x += 1
        return x
return inner

p = foo()
print(p())
print(p())
print(p())

可以从单步调试来观看x值的变化。





闭包作用:

可以用来编写惰性求值的代码,可以用在函数调用时保持特定状态。

装饰器中要用到闭包。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值