一般情况下,闭包的函数体内是避免使用循环变量的,因为调用主体函数时, 循环变量一般是执行结束后,返回一个执行后的值。
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(),f2(),f3())
- 预期返回的结果是1,4,9,但实际返回的结果是9,9,9
- 原因就是当count()函数返回了3个函数时,这3个函数所引用的变量 i 的值已经变成了3
大专栏 闭包函数如何使用循环变量" title="解决方案一">解决方案一
- 方法:问题的产生是因为函数只在执行时才去获取外层参数i,若函数定义时可以获取到i,问题便可解决。而默认参数正好可以完成定义时获取i值且运行函数时无需参数输入的功能,所以在函数f()定义中改为f(m = i),函数f返回值改为m*m即可。
代码修改:
def count():
fs = []
for i in range(1, 4):def f(m = i): return m * m fs.append(f)
return fs
f1,f2,f3 = count()
print(f1(),f2(),f3())
1,4,9
来源:https://www.cnblogs.com/lijianming180/p/12037927.html