zoukankan      html  css  js  c++  java
  • 闭包引起值变化(转)

    python的闭包当内层函数引用外层函数的局部变量时,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变

    如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def count():
        fs = []
        for in range(14):
            def lazy_count(j):
                def cou():
                    return j*j
                return cou
            = lazy_count(i)
            fs.append(r)
        return fs
     
    f1, f2, f3 = count()
    print f1(), f2(), f3()

    如果以上代码写成如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    def count():
        fs = []
        for in range(14):
            def f():
                 return i*i
            fs.append(f)
        return fs
     
    f1, f2, f3 = count()

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

    1
    f1, f2, f3 = count()

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

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

    本文出自 “keep_study_zh” 博客,请务必保留此出处http://zhkpsty.blog.51cto.com/9013616/1695120

  • 相关阅读:
    求24点
    关于参数和返回值的常量性
    点到平面的距离公式
    大端序与小端序
    Quake3中的绝对值函数
    整数超出范围时如何表示?
    关于数组的几道面试题
    在移位数组中查找数
    时间复杂度O(n),空间复杂度O(1)的排序
    C++之对象切割
  • 原文地址:https://www.cnblogs.com/shixisheng/p/7471060.html
Copyright © 2011-2022 走看看