关于python闭包的一些疑问
def count():
fs = []
for i in range(1, 4):
def f(j):
def g():
return j*j
return g
r = f(i)
fs.append(r) #fs作为列表,为什么可以append(r)?(而r是f所返回的函数)
return fs #个人的想法应该是fs.append(r())
f1, f2, f3 = count()
print f1(), f2(), f3()
想弄明白的是:这里传入append的r是以什么形式传入的呢
谢谢各位指教:D
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
是以函数定义的形式传入的, 类似于延迟调用, 你个例子不太明显,
你可以将函数中的return r的r 看成是一个变量, 不过这个变量保存的是函数的定义,
后面通过x(),才是对函数的真正调用
r 是 对象,而这个对象的 类型 是函数。
换句话说,r 是类型为函数的对象,就像
1是类型为 整数 的对象
'hi' 是类型为 字符串 的对象一样
如果改成
fs.append(r())
也是可以的,但是函数意义就不同了,执行count()
函数后其会返回结果[1, 4, 9]
,而不能再使用print f1(), f2(), f3()
打印出结果,原因在于:注意这里是
g
不是g()
,所以执行count()
返回的其实是[g1, g2, g3]
一个包含三个闭包函数的列表,每个闭包函数绑定的自由变量不同(分别是1, 2, 3),因此将这个列表解包给f1, f2, f3
后,执行print f1(), f2(), f3()
相当于执行三个函数后并打印出结果,因此最终输出1, 4, 9
f1 = fs[0] = r = g
所以才能
f1()