搜尋

首頁  >  問答  >  主體

函数 - 关于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

PHPzPHPz2888 天前238

全部回覆(4)我來回復

  • 迷茫

    迷茫2017-04-17 17:31:24

    是以函數定義的形式傳入的, 類似於延遲調用, 你個例子不太明顯,

    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(),才是對函數的真正呼叫

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 17:31:24

    r 是 物件,而這個物件的 類型 是函數。

    換句話說,r 是類型為函數的對象,就像

    • 1是類型為 整數 的物件

    • 'hi' 是類型為 字串 的物件一樣

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 17:31:24

    如果改成fs.append(r())也是可以的,但是函數意義就不同了,執行count()函數後會回傳結果 [1, 4, 9],而不能再使用print f1(), f2(), f3()印出結果,原因在於: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 rrreee

    注意這裡是g 不是g(),所以執行count()回傳的其實是[g1, g2, g3] 一個包含三個閉包函數的列表,每個閉包函數綁定的自由變數不同(分別是1, 2, 3),因此將這個列表解包給f1, f2, f3 後,執行print f1(), f2(), f3()相當於執行三個函數後並列印出結果,因此最終輸出1, 4, 9< /code>🎜

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 17:31:24

    f1 = fs[0] = r = gf1 = fs[0] = r = g

    所以才能

    f1()

    所以才能 🎜 🎜f1()🎜

    回覆
    0
  • 取消回覆