python 闭包中引用的变量值变更问题

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

如下:

def count():
    fs = []
    for i in range(1, 4):
        def lazy_count(j):
            def cou():
                return j*j
            return cou
        r = lazy_count(i)
        fs.append(r)
    return fs

f1, f2, f3 = count()
print f1(), f2(), f3()

如果以上代码写成如下:

def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs

f1, f2, f3 = count()

最终得到的f1, f2, f3就都是9,是因为这行:

f1, f2, f3 = count()

里得到的count()函数中的f()函数中的i已经迭代至3了,最终得出的结果只能是9 9 9

而刚开始给出的代码中f1,f2,f3其实得到的是一个序列而已,而计算这个序列中每个元素时引用的闭包中的外层函数中的变量随着迭代变更,从1至3,并且同时计算出该次迭代所得的元素值append进序列返回,顾最终结果为1 4 9

时间: 2024-12-26 16:59:22

python 闭包中引用的变量值变更问题的相关文章

引用 互换变量值 -- C

#include <stdio.h> void swap(int * p, int * q) { int tmp; tmp = *p; *p = *q; *q = tmp; } void swap1(int &p, int &q) { int tmp; tmp = p; p = q; q = tmp; } int main() { int a = 1, b = 2; /* 大家都见过,不多做解释 */ swap(&a,&b); printf("a =

数据科学实战手册(R+Python)书中引用资料网址

本文会持续将<数据科学实战手册(R+Python)>一书中的附带参考资料网址手打出来, 方便访问. 由于书中的参考资料网址太多, 这个文档将可能花费一段时间才能完成. 第一章 P7  Rstdio (http://www.rstdio.com/) 参考Gettinng Started with R文章: http://support.rstdio.com/hc/en-us/articles/201141096-Getting-Started-With-R 访问RStdio的主页: http:/

触发更新 ServletContext 中的全局变量值

[前情提要] ServletContext对象--三大域对象 Servlet三大域对象的应用 request.session.application(ServletContext) ServletContext是一个全局的储存信息的空间,服务器开始就存在,服务器关闭才释放. (1)request,一个用户可有多个: (2)session,一个用户一个: (3)而servletContext,所有用户共用一个.所以,为了节省空间,提高效率,ServletContext中,要放必须的.重要的.所有用

获取oracle sql语句中绑定变量值的方法

在诊断 sql的性能问题时,我们有时候需要获取其绑定变量的实际值,然后将此实际值带入到sql语句当中,用原来的sql构成select语句(带where条件),实际的执行一下,看一下选择性如何. 本文就是说获取其绑定变量值的方法.本文的编写得到枯荣长老的帮助,在此表示感谢. 本文适用于与oracle 10G或者更高版本的db. alter session set nls_date_format = 'yyyy-mm-dd,hh24:mi:ss'; set linesize 400 col sql_

Python的模块引用和查找路径

模块间相互独立相互引用是任何一种编程语言的基础能力.对于"模块"这个词在各种编程语言中或许是不同的,但我们可以简单认为一个程序文件是一个模块,文件里包含了类或者方法的定义.对于编译型的语言,比如C#中的一个.cs文件,Java中的一个.java或者编译后的.class文件可以认为是一个模块(但常常不表述为模块):对于解释型的语言会更加直观些,比如PHP的.php文件,在Python中就是.py文件可以认为是一个模块.在"模块"之上有"包",主要是

C++中引用的常见用法

在C++中引用类型是一个强大的存在,它一定程度上规避了指针带来的风险,并且使得函数参数之间的传值和通信变得异常灵活. 1.引用的概念 在C++中,可以定义引用如下: 1 int n; 2 int &r = n; 这样定义以后,r就是int型变量n的一个引用.可以理解为给变量n取了一个“别名”叫r,从此r跟n便绑定在一起了.修改r的值,实际上也就等于修改了n的值:使用r,实际上也就等于使用n. 需要注意的是:引用类型在定义时就必须初始化(如上述代码将其初始化为n)——这是很自然的,试想一下我们如果

python编程中的if __name__ == &#39;main&#39;: 的作用和原理

在大多数编排得好一点的脚本或者程序里面都有这段if __name__ == 'main': ,虽然一直知道他的作用,但是一直比较模糊,收集资料详细理解之后与打架分享. 1.这段代码的功能 一个python的文件有两种使用的方法,第一是直接作为脚本执行,第二是import到其他的python脚本中被调用(模块重用)执行.因此if __name__ == 'main': 的作用就是控制这两种情况执行代码的过程,在if __name__ == 'main': 下的代码只有在第一种情况下(即文件作为脚本

Python闭包和装饰器

(1)python的LEGB: LEGB是指:按照L>E>G>B 的顺序优先级进行变量查找. L:local函数内部作用域,是最底层的单个函数里面: E:enclosing函数内部与内嵌函数之间,是有内部函数的函数里面: G:global 全局作用域,是一个.py文件中: B:build-in内置作用域,比如:tuple,list,元组.是所有.py文件中. (2)闭包 闭包是指:一个函数中内嵌了另一个函数,这个内嵌的函数会使用外部函数的参数变量,作为判决内嵌函数的不同运行模式的参考.最

【转】python编程中的if __name__ == &#39;main&#39;: 的作用和原理

在大多数编排得好一点的脚本或者程序里面都有这段if __name__ == 'main': ,虽然一直知道他的作用,但是一直比较模糊,收集资料详细理解之后与打架分享. 1.这段代码的功能 一个python的文件有两种使用的方法,第一是直接作为脚本执行,第二是import到其他的python脚本中被调用(模块重用)执行.因此if __name__ == 'main': 的作用就是控制这两种情况执行代码的过程,在if __name__ == 'main': 下的代码只有在第一种情况下(即文件作为脚本