为了账号安全,请及时绑定邮箱和手机立即绑定

求大神解答

def count():    fs = []    for i in range(1, 4):        def f():             return i*i        fs.append(f)    return fs f1, f2, f3 = count() 可以帮我解释下吗?fs.append(f)  没看懂什么意思

正在回答

3 回答

这个是讲的python的闭包吧。是这个意思,这里本来想返回 1*1,2*2,3*3,然后 fs.append(f),首先说 append,是将f的引用添加到数组fs中,这个时候,只是添加的f的引用,没有保留i的值,然后在 count执行到f()方法时,因为i的值没有保留下来,所以,当循环结束,i的值为3,也就是说,fs在执行阶段,取出的f(3)的结果,就是9了,所以 f1,f2,f3都为9了,如果想实现f1=1,f2=4,f3=9,那么,需要的是,不仅要保留住f的引用,还需要保留住i的值,所以,代码如下:

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

f1, f2, f3 = count()

这样,就保留住了i的值,即,fs中保留的是 [f(1),f(2),f(3)],再计算f函数的结果,即fs=[1,4,9]

2 回复 有任何疑惑可以回复我~
#1

子木李

不好意思,说错了一点,fs中保留的是 [f(1),f(2),f(3)],再计算f函数的结果,即f1=f(1),f2=f(2),f3=f(3),因为f函数执行的结果是返回g,要显示1,4,9,时,需要再调用函数g(),也即是需要再在后面增加一个(),即 print f1(), f2(), f3()
2015-10-17 回复 有任何疑惑可以回复我~
#2

洛枫楠 提问者

非常感谢!
2015-10-19 回复 有任何疑惑可以回复我~
#3

洛枫楠 提问者 回复 子木李

麻烦您了。刚开始看了几遍没看懂,不知道结构是什么样的
2015-10-19 回复 有任何疑惑可以回复我~
def count():
    fs = []
    for i in range(1,4):
        def f():
            return i*i
        fs.append(f)
    return fs

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

用指针的方法解释:

appen返回的是f的函数变量,值是可变化的,当for循环结束f函数的变量值最终都是指向9

同样的f1,f2,f3每次都是取的f这个变量的值,指向的值就是9

不知道这样解释对不对

0 回复 有任何疑惑可以回复我~

或者这样写,在append时,就执行掉返回的g函数,如下:

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

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

区别是  前面是

 fs.append(f(i))
 ...
 print f1(),f2(),f3()

后面是

 fs.append(f(i)())
 ...
 print f1,f2,f3


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255665    人
  • 解答问题       2949    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

求大神解答

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信