Python中闭包及循环变量的一点注意事项

闭包是编程语言通用的一种编程范式,且是面试中必问的问题之一。初学者可能在闭包中纠结好一阵子,当时学习JavaScript时我也在这里踩了不少坑,以Python的闭包为例写点注意事项就当是学习的一点总结吧。

高阶函数除了可以将函数作为参数之外,还可以将函数作为结果值返回,闭包的具体定义可以谷歌一下,通俗点来讲,闭包就是返回函数以及函数的自我调用,我是这么理解的。以如下最精简的函数为例解释闭包:


当我们调用函数f时,返回的并不是阶乘结果,而是返回的g函数体



调用返回结果才会返回阶乘结果



注:不可直接调用函数内部的函数,即g()

我们在函数f内部定义了函数g,内部函数可以引用外部函数f的参数和局部变量,当函数f返回函数g时,相关的参数和局部变量都保存在返回的函数g中,这种就成为闭包。

需要注意的问题是,返回的函数并没有立刻执行,而是直到调用了f()才执行。我们来看一个例子:


可能有人会猜想结果为1,4,9,实际执行打印出来的结果如下


原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9。

返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。

如果一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变:


这回执行结果符合预期了:


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 86.复合 Cases 共享相同代码块的多个switch 分支 分支可以合并, 写在分支后用逗号分开。如果任何模式...
    无沣阅读 1,412评论 1 5
  • 要点: 函数式编程:注意不是“函数编程”,多了一个“式” 模块:如何使用模块 面向对象编程:面向对象的概念、属性、...
    victorsungo阅读 1,552评论 0 6
  • Python进阶框架 希望大家喜欢,点赞哦首先感谢廖雪峰老师对于该课程的讲解 一、函数式编程 1.1 函数式编程简...
    Gaolex阅读 5,517评论 6 53
  • 之前没有了解过Rxjava的童鞋,建议先阅读《Rxjava 从入门到开发》这篇文章,对入门比较有帮助。 Start...
    Forrest32阅读 665评论 0 8
  • 高原上 那青草 千年摇曳 草地上 那羚羊 呼啸而过 骑着马的女子 低头和长发 山尖上的男子 仰头和怅惘 那笑声 激...
    南京遇上西京阅读 398评论 0 2