码迷,mamicode.com
首页 > 其他好文 > 详细

分析一个闭包函数

时间:2016-05-03 00:47:17      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:return   count   

分析一段代码


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=counrt()


f1, f2, f3 = count() 相当于 [f1, f2, f3] = [f,  f, f]

相当于 f1 = f

f2 = f

f3 = f


fs.append(f)

注意这里是将函数f添加到了fs中,而不是f返回的值,可以尝试执行命令:

>>> f
<function f at 0x00000283BF7706A8>
>>> count()
[<function count.<locals>.f at 0x00000283BF770840>, <function count.<locals>.f at 0x00000283BF7707B8>, <function count.<locals>.f at 0x00000283BF770598>]

可见返回的是一个由三个函数组成的list。 因此当执行代码

f1, f2, f3 = count()

时,将count包含的三个函数按索引顺序分别赋给f1, f2, f3,而此时i=3,所以函数计算结果全部为9.

>>> f1()
9
>>> f2()
9
>>> f3()
9

           

在python中一切皆对象,而变量i只有一个,在三次循环中,它指向的对象变化了而已,而函数f1,f2,f3在实际执行的时候i指向的那个地址的实际存放数据已经变为3了,所以三次结果都是一样的。


fs.append(f)这里的f只是指针  不是函数  所以不执行  等到什么时候用什么时候执行 所以在for循环3次之后i变成了3  f总是在所有的执行完了才会去调用  因为它被放在【】中


不管调用几次count  他其中的for已经执行3次  i已经变成3所以此时执行f函数   使用的当然是3

本文出自 “生活就是等待戈多” 博客,请务必保留此出处http://chenx1242.blog.51cto.com/10430133/1769485

分析一个闭包函数

标签:return   count   

原文地址:http://chenx1242.blog.51cto.com/10430133/1769485

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!