为了账号安全,请及时绑定邮箱和手机立即绑定

Python变量范围,为什么funcs打印相同的值?

Python变量范围,为什么funcs打印相同的值?

慕标琳琳 2021-05-31 09:19:57
我有这个程序:funcs = { idx: lambda: print(idx) for idx in range(5) }本质上,我们有一个索引和函数的字典:{0: <function __main__.<dictcomp>.<lambda>()>, 1: <function __main__.<dictcomp>.<lambda>()>, 2: <function __main__.<dictcomp>.<lambda>()>, 3: <function __main__.<dictcomp>.<lambda>()>, 4: <function __main__.<dictcomp>.<lambda>()>}但是,以下函数调用具有相同的结果:funcs[4]()4funcs[0]()4为什么我4两次都得到输出,即使我使用不同的输入?
查看完整描述

1 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

实际发生的事情是这样的:


lambdas 是使用idx in range(5). 当一个 lambda 被调用时,无论调用者的 idx 参数是什么idxfuncs[idx]()(即里面是什么都无关紧要),lambda 使用的是idxfrom range(5)。由于range(5)now(在末尾)指向4,即idx每个lambda所使用的值,因此所有这些lambda都打印4。


Lambda是不同的对象,但是它们仍然都使用当前的inner idx。


这是一个对我有帮助的例子:


ls=[]

for i in range(2):

    ls.append(lambda : print(i))


for f in ls:

    print(id(f), end=' ')

    f()


for i in range(3,5):

    ls.append(lambda : print(i))



for f in ls:

    print(id(f), end=' ')

    f()


44467888608 1 # 1st lambda - uses the last idx (for range was 2)

44467888336 1 # 2nd lambda - uses the last idx (for range was 2)

44467888608 4 # 1st lambda - uses the current last idx (2nd for range was 5)

44467888336 4 # 2nd lambda - uses the current last idx (2nd for range was 5)

44467921240 4 # 3rd + 4th lambdas

44467921512 4


查看完整回答
反对 回复 2021-06-01
  • 1 回答
  • 0 关注
  • 227 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号