闭包引起值变化(转)

mac2022-06-30  80

python的闭包当内层函数引用外层函数的局部变量时,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变。

如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 def  count():      fs  =  []      for  i  in  range ( 1 ,  4 ):          def  lazy_count(j):              def  cou():                  return  j * j              return  cou          r  =  lazy_count(i)          fs.append(r)      return  fs   f1, f2, f3  =  count() print  f1(), f2(), f3()

如果以上代码写成如下:

1 2 3 4 5 6 7 8 9 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就都是9,是因为这行:

1 f1, f2, f3  =  count()

里得到的count()函数中的f()函数中的i已经迭代至3了,最终得出的结果只能是9 9 9

而刚开始给出的代码中f1,f2,f3其实得到的是一个序列而已,而计算这个序列中每个元素时引用的闭包中的外层函数中的变量随着迭代变更,从1至3,并且同时计算出该次迭代所得的元素值append进序列返回,顾最终结果为1 4 9

本文出自 “keep_study_zh” 博客,请务必保留此出处http://zhkpsty.blog.51cto.com/9013616/1695120

转载于:https://www.cnblogs.com/shixisheng/p/7471060.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)