美文网首页
2018-08-23

2018-08-23

作者: 淡水t海边 | 来源:发表于2018-08-23 16:56 被阅读0次

    闭包:

    注意到返回的函数在其定义内部引用了局部变量args,所以,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用。返回的函数并没有立刻执行,而是直到调用了f()才执行

    def count():

    ...    fs = []

    ...    for i in range(1,4):

    ...        def f():

    ...            return i*i

    ...        fs.append(f)

    ...    return fs

    ...

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

    f1()

    9

    >>> f2()

    9

    >>> f3()

    9


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

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


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


    def count():

    ...    def f(j):

    ...        def g():

    ...            return j*j

    ...        return g

    ...    fs = []

    ...    for i in range(1,4):

    ...        fs.append(f(i))

    ...    return fs

    ...

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

    >>> f1()

    1

    >>> f2()

    4

    >>> f3()

    9

    缺点是代码较长,可利用lambda函数缩短代码

    相关文章

      网友评论

          本文标题:2018-08-23

          本文链接:https://www.haomeiwen.com/subject/zlupiftx.html