关于python闭包的一些疑问

发布于 2022-09-02 11:56:14 字数 422 浏览 22 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

提笔落墨 2022-09-09 11:56:14

是以函数定义的形式传入的, 类似于延迟调用, 你个例子不太明显,

def count():
    def r():
        return "hello world"
    return r          
x =  count()  
print x #<function r at 0x7fc562978668>
print x() # hello world

你可以将函数中的return r的r 看成是一个变量, 不过这个变量保存的是函数的定义,
后面通过x(),才是对函数的真正调用

半城柳色半声笛 2022-09-09 11:56:14

r 是 对象,而这个对象的 类型 是函数。

换句话说,r 是类型为函数的对象,就像

  • 1是类型为 整数 的对象

  • 'hi' 是类型为 字符串 的对象一样

遗弃M 2022-09-09 11:56:14

如果改成fs.append(r())也是可以的,但是函数意义就不同了,执行count()函数后其会返回结果[1, 4, 9],而不能再使用print f1(), f2(), f3()打印出结果,原因在于:

r=f(i)=g

注意这里是 g 不是 g(),所以执行count()返回的其实是[g1, g2, g3]一个包含三个闭包函数的列表,每个闭包函数绑定的自由变量不同(分别是1, 2, 3),因此将这个列表解包给f1, f2, f3后,执行print f1(), f2(), f3()相当于执行三个函数后并打印出结果,因此最终输出1, 4, 9

空宴 2022-09-09 11:56:14

f1 = fs[0] = r = g

所以才能

f1()

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文