不懂笔记 笔记

def num():
   return [lambda x: i * x for i in range(4)] 
print([m(2) for m in num()])

详解:

def func():
    fun_lambda_list = []
    for i in range(4):

        def lambda_(x):
            print('Lambda函数中 i {} 命名空间为:{}:'.format(i, locals()))
            return x*i
        fun_lambda_list.append(lambda_)
        print('外层函数 I 为:{} 命名空间为:{}'.format(i, locals()))

    return fun_lambda_list

fl = func()
fl[0](1)
fl[1](1)
fl[2](1)
fl[3](1)

运行结果:

外层函数 I 为:0 命名空间为:{'fun_lambda_list': [<function func.<locals>.lambda_ at 0x0000020A45679288>], 'lambda_': <function func.<locals>.lambda_ at 0x0000020A45679288>, 'i': 0}
外层函数 I 为:1 命名空间为:{'fun_lambda_list': [<function func.<locals>.lambda_ at 0x0000020A45679288>, <function func.<locals>.lambda_ at 0x0000020A45679318>], 'lambda_': <function func.<locals>.lambda_ at 0x0000020A45679318>, 'i': 1}
外层函数 I 为:2 命名空间为:{'fun_lambda_list': [<function func.<locals>.lambda_ at 0x0000020A45679288>, <function func.<locals>.lambda_ at 0x0000020A45679318>, <function func.<locals>.lambda_ at 0x0000020A456793A8>], 'lambda_': <function func.<locals>.lambda_ at 0x0000020A456793A8>, 'i': 2}
外层函数 I 为:3 命名空间为:{'fun_lambda_list': [<function func.<locals>.lambda_ at 0x0000020A45679288>, <function func.<locals>.lambda_ at 0x0000020A45679318>, <function func.<locals>.lambda_ at 0x0000020A456793A8>, <function func.<locals>.lambda_ at 0x0000020A45679438>], 'lambda_': <function func.<locals>.lambda_ at 0x0000020A45679438>, 'i': 3}
Lambda函数中 i 3 命名空间为:{'x': 1, 'i': 3}:
Lambda函数中 i 3 命名空间为:{'x': 1, 'i': 3}:
Lambda函数中 i 3 命名空间为:{'x': 1, 'i': 3}:
Lambda函数中 i 3 命名空间为:{'x': 1, 'i': 3}:

原理:

i 在外层作用域

lambda x: x*i 为内层(嵌)函数,他的命名空间中只有 {‘x’: 1} 没有 i ,

所以运行时会向外层函数(这儿是列表解析式函数 [ ])的命名空间中请求 i

而当列表解析式运行时,列表解析式命名空间中的 i 经过循环依次变化为 0–>1–>2–>3 最后固定为 3 ,

所以当 lambda x: x*i 内层函数运行时,去外层函数取 i 每次都只能取到 3。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rocjian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值