python的闭包的特点是返回的函数还引用了外层函数的局部变量,所以,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变。
如下:
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()
如果以上代码写成如下:
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,是因为这行:
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
原文地址:http://zhkpsty.blog.51cto.com/9013616/1695120