闭包练习,为什么第一个写法和第二个学法输出不一样?

2021-07-07 17:20:01 +08:00
 yellowtail
def fapi(i):
def fuc():
return i**2
return fuc

l=[]
for i in range(4):
l.append(fapi(i))
l[0]()

def mainf():
l = []
for i in range(4):
def f():
return i**2
l.append(f)
return l

mainf()[0]()

def mainf2():
l = []
def f():
return i**2
for i in range(4):
l.append(f)
return l

mainf2()[0]()
1013 次点击
所在节点    Python
3 条回复
frostming
2021-07-08 14:01:47 +08:00
缩进全丢了让人怎么看?

mainf 和 mainf2 效果是完全一样的,闭包内的自由变量直到包装的函数被调用时才会真正去寻值,i 都等于 3
yellowtail
2021-07-10 13:34:47 +08:00
@frostming 手机发帖不习惯,想了下没有缩减也不会有歧义,抱歉...不过第一个也都是对应的 i,结束以后应该都是 9 。
frostming
2021-07-12 11:46:12 +08:00
第一个是正常输出 0,建议你重试下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/788134

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX