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

我有这个程序:


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]()

4

funcs[0]()

4

为什么我4两次都得到输出,即使我使用不同的输入?


慕标琳琳
浏览 228回答 1
1回答

哈士奇WWW

实际发生的事情是这样的: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):&nbsp; &nbsp; ls.append(lambda : print(i))for f in ls:&nbsp; &nbsp; print(id(f), end=' ')&nbsp; &nbsp; f()for i in range(3,5):&nbsp; &nbsp; ls.append(lambda : print(i))for f in ls:&nbsp; &nbsp; print(id(f), end=' ')&nbsp; &nbsp; 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 lambdas44467921512 4
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python