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

关于python闭包的问题

针对课后的问题,我们可以知道原来的错误代码问题出在了:向fs这个list中加入的是函数f的引用,而非f()计算后的值,所以导致最终运行时,i=3,所有结果都为9.

那么,问题来了:

对于课后的习题我可不可以这样:

def count():

      fs=[]

      for i in range(1,4):

            def f(i):

                   return i*i   #定义一个函数计算i*i的值

             r=f(i)               #调用函数f,并将返回值赋给r

             fs.append(r)  #将r输入到fs这个list中

   return fs

f1,f2,f3=count()

print f1(),f2(),f3()

请问哪里出了问题?


正在回答

3 回答

因为你获取的r此时是个int型的数值,所以fs也是一个int的list,而不是函数的list,所以f1,f2,f3是三个int型的整数,在int后面加上括号自然是不能调用的。建议用Python的命令行演示一下,脚本最后输入f1(),回车,会出现错误:

In [7]: f1()

---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-7-eb1cde7968c6> in <module>()

----> 1 f1()


TypeError: 'int' object is not callable

这就很清楚了

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

zeroandzoro 提问者

非常感谢!
2017-07-09 回复 有任何疑惑可以回复我~

前面的同学门说的很有道理,我的理解是呢:像楼主这样f() 不用闭包直接return i*I  在r = f(i)的时候f已经执行了I*I,r接收到的是一个函数值(函数的结果),是int型的,不是一个函数,也就不能f()这样调用了 

如果是f() 里在添一个g函数,就是我们说的闭包

f (j):

    def g(j):

        return j*j

return g

r=f(i)

这时候呢,f返回的就是一个函数了,只有当我们调用f()的时候,就是这里r=f(i),r返回的实际上就是g这个函数,而j*J的结果的地址会作为这个函数对象的属性存在,只有对r调用(就是对g调用)才会执行g函数的内部语句

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

zeroandzoro 提问者

谢谢回答
2017-07-09 回复 有任何疑惑可以回复我~

因为在运行r=f(i)时已经返回了数值,导致count()的运行结果是[1,4,9],而不是函数,所以print f1(),f2(),f3()会出错。

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

zeroandzoro 提问者

谢谢回答
2017-07-09 回复 有任何疑惑可以回复我~

举报

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

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

进入课程

关于python闭包的问题

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