Python闭包的问题

Python的闭包我理解了 但是有段代码 执行了流程我实在很纳闷 所以求各位帮忙看下
  1. def count():
  2.     fs = []
  3.     for i in range(1, 4):
  4.         def f():
  5.             return i*i
  6.         fs.append( f )
  7.     return fs

  8. f1, f2, f3 = count()
  9. #这段代码我理解的。因为 在执行 f1(),f2(),f3()的时候 找到的i值为 3所以都是9
  10. print('f1的结果是:' ,f1())
  11. print('f2的结果是:' ,f2())
  12. print('f3的结果是:' ,f3())
请先 登录 后评论

5 个回答

可小可大
Python的闭包我理解了 但是有段代码 执行了流程我实在很纳闷 所以求各位帮忙看下
  1. def count():
  2.     fs = []
  3.     for i in range(1, 4):
  4.         def f():
  5.             return i*i
  6.         fs.append( f )
  7.     return fs

  8. f1, f2, f3 = count()
  9. #这段代码我理解的。因为 在执行 f1(),f2(),f3()的时候 找到的i值为 3所以都是9
  10. print('f1的结果是:' ,f1())
  11. print('f2的结果是:' ,f2())
  12. print('f3的结果是:' ,f3())

这个代码我是理解了的。
下面的代码就有些难以理解了 百度了一大堆 也没有人说为啥,。就是全部交付代码 什么也不说

  1. def count():
  2.     def f(j):
  3.         
  4.         def g():
  5.             return j*j  #这里的代码被先执行了吗?
  6.         
  7.         return g
  8.     fs = []
  9.     for i in range(1, 4):
  10.         fs.append( f( i ) )
  11.     return fs   #那这里的代码又是返回了 谁呢?

  12. f1, f2, f3 = count()
  13. #这里的我就有点纳闷了。 是因为 f(i) 执行了函数 g()么?
  14. print('f1的结果是:' ,f1())
  15. print('f2的结果是:' ,f2())
  16. print('f3的结果是:' ,f3())


请先 登录 后评论
刘泽群
如果你真的理解了第一组代码输出都是9的原因,以及必包,那第二组代码很好理解啊。
首先05 行代码没有运行。至于14行的问题,我们从头说
python从上到下预处理你顶层函数,13行开始执行,执行 count() 函数,进入count() 函数继续预处理顶层函数,在08行开始执行,创建一个空列表 fs,迭代第一次,i=1,fs列表添加的元素是一个以 i 为参数的函数 f() ,程序进入函数 f(i) ,预处理 g() 函数,返回调用对象 g,添加到 fs 列表中,完成一次迭代。继续执行第二次第三次迭代。返回 fs 列表,之后将列表 fs 内的元素拆包给三个变量 f1, f2, f3,然后继续向下执行,15行 print()函数,执行f1() 。
请先 登录 后评论
恋狼

如果你真的理解了第一组代码输出都是9的原因,以及必包,那第二组代码很好理解啊。
首先05 行代码没有运行 ...

也就是说,f(i) 是执行函数 f() 带入参数i 这时候的 参数i其实也作为g 函数的闭包变量i.  g函数并未执行,所以每次迭代每次都会生产不同的参数/变量i的值。 在 15~17行代码 运行 f1,f2,f3 其实就是在运行 g的三个不同变量的函数。对么?
请先 登录 后评论
时榕-余
也就是说,f(i) 是执行函数 f() 带入参数i 这时候的 参数i其实也作为g 函数的闭包变量i.  g函数并未执行 ...

是的,这段代码其实就是用来理解必包的。 但是 g()不需要参数。
请先 登录 后评论
瑶小兔M

是的,这段代码其实就是用来理解必包的。 但是 g()不需要参数的.

好的多谢指点了。
请先 登录 后评论
  • 5 关注
  • 0 收藏,686 浏览
  • 欧阳平静 提出于 2021-02-28 12:02

相似问题