通过python理解闭包

先看一个简单的函数

1 def calc_sum(1st):2     def lazy_sum():3    return sum(1st)4  return lazy_sum

此时发现没法把lazy_sum移到calc_sum的外部,因为它引用了calc_sum的参数lst.

像这种内层函数引用了外层函数的变量(参数也算变量)。然后返回内层函数的情况,称为闭包(closure).

闭包的特点是返回的函数还引用了外部函数的局部变量,所以要正确的使用闭包,就要确保引用的局部变量在函数返回后不能变。

下来我们来看一个案例应该就明白了:

实际结果全都是9

原因就是当count()函数返回了三个函数时,这三个函数所引用的变量i的值已经变成了3,由于f1,f2,f3并没有被调用,所以他们并未计算i*i,当F1被调用时:结果为9.

因此,返回函数不要饮用任何循环变量,或者后续会大声变化的变量。

像下面这样这样改写了count()函数后,他就可以正确的返回149了

时间: 2024-12-22 04:02:30

通过python理解闭包的相关文章

Python 应用闭包思路动态生成unittest执行脚本---分析问题,解决问题,记录填坑。

至于为什么要动态生成unittest执行脚本,以及设计思路,代码阅读参考前文,传送门.好了,本文我们就上一篇文章中的问题做一下分析,记录一下填坑之路吧,这个坑真特么深,挣扎了好久才出来. 首先我们先说一下问题在哪,因为使用了闭包,闭包会绑定变量无法清除无法更改,假如我第一次运行testall函数循环两次,第一次是正常的,第二次运行testall函数循环一次,那么生成的报告就会出现问题,会出现第一次运行的结果.即是:后一次循环运行只要比前一次循环少,那么report一定会出现前一次的结果,必先的b

Python之闭包

# -*- coding: utf-8 -*- #python 27 #xiaodeng #Python之闭包 #http://python.jobbole.com/82624/ #闭包:函数是一个对象,所以可以作为某个函数的返回结果 def line_conf(): def line(x): return 2*x+1 return line#line_conf的返回结果被赋给line对象 MyLine = line_conf() print MyLine(5)#11 print '**'*20

ES6之let(理解闭包)和const命令

ES6之let(理解闭包)和const命令 最近做项目的过程中,使用到了ES6,因为之前很少接触,所以使用起来还不够熟悉.因此购买了阮一峰老师的ES6标准入门,在此感谢阮一峰老师的著作. 我们知道,ECMAScript 6即ES6是ECMAScript的第五个版本,因为在2015年6月正式发布,所以又成为ECMAScript2015.ES6的主要目的是为了是JS用于编写复杂的大型应用程序,成为企业级的开发语言. 说明:由于有时候我们希望得知es6代码的具体实现原理或者说希望能够转化为es5使用,

python的闭包

如果在一个内部函数里,对在外部作用域(非全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).定义在外部函数内的,担忧内部函数引用或者使用的变量称为自由变量,闭包在函数式编程中是一个重要的概念. 闭包将内部函数自己的代码和作用域以及外部函数的作用域结合起来,闭包的词法变量不余数全局名称空间域或者局部的--属于其他的名称空间. python的namespace: python通过namespace来检索变量/函数/方法,在python中有三种namespace·local na

JS 理解闭包

闭包是js的一个难点,许多高级应用都需要用闭包实现.要理解闭包,首先必须理解Javascript特殊的变量作用域,其次是垃圾回收机制. 一.理解变量作用域 ①  变量分为全局变量和局部变量,在函数内部可以直接读取全局变量,如: var a = 100; function x1(){ alert(a); } x1();  //得到 100 而在函数外部,自然无法读取函数内部的局部变量,如: function x1(){ var a = 100; } alert(a);//error ps:如果在函

javascript深入理解闭包

一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量. Js代码 function f1(){ var n=999; } alert(n); // error 这里有一个地方需要注意,函数

js深入理解"闭包"

一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量. Js代码 function f1(){ var n=999; } alert(n); // error 这里有一个地方需要注意,函数

一步一步的理解闭包

一步步的理解闭包: javascript是函数作用域,按常理来说,一个函数就不能访问另一个函数中的变量. 而我们实际操作有时候需要用一个函数去操作另一个函数中的变量. 为了能够访问另一个函数作用域中的变量,javascript提供一种内部机制,给嵌套在其它函数中的函数提供了一种父作用域链保存机制. 当内部函数创建时,静态的保存了父作用域链,即使父函数执行完毕,其变量对象(这里面保存着我们想要的父变量)一直保存在内部函数的作用域链中.内部函数不再被调用之前,这个活动对象一直在内存中(通俗讲就是这时

JavaScript要理解闭包先了解词法作用域

之所以取名叫做词法作用域,是这个概念是js中相当基础也是极为重要的,很多想当然的错误或感觉怪异的问题都是和这个东西有关.所以,本文主要说下这个名词的概念以及讨论下他牵扯出来的有关变量.函数.闭包的问题. 由变量开始谈 习惯性先来段代码: view source print? 1 var x = "globol value"; 2 var getValue = function() 3 { 4     alert(x);    //弹出"undefined" 5