直接上个例子
'''闭包的陷阱'''
def test3():
fun_list = []
for i in range(1,4):
def test4():
return i**2
fun_list.append(test4)
return fun_list
f1,f2,f3 = test3()
print(f1(),f2(),f3())
做一个把1到3的平方放入一个数列中,这里运用了闭包
按理来说输出结果应该是 1 4 9,但结果却输出9 9 9
原因是f1,f2,f3在创建时没有及时调用test4,导致最后返回的fun_list列表其实是
[i**2,i**2,i**2]
然而此时for循环完了,这时的 i = 3,因此最后的列表
[9,9,9]
解决方法
给test4添加一个局部变量,将每次循环中的i赋值给一个局部变量
def test4(a=i):
return a**2
这样的话,在创建f1,f2,f3时就已经将a=1,a=2,a=3分别赋予了
[1**1,2**2,3**3]
得到结果
[1,4,9]