python闭包的陷阱(举例)

直接上个例子

'''闭包的陷阱'''
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]

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值