Python閉鎖の穴

5055 ワード

閉パッケージ(closure)関数が内部で定義され、内部の関数に外部関数のパラメータまたは局所変数が適用され、内部関数が戻り値として扱われると、関連パラメータと変数が戻り関数に保存され、この結果を閉パッケージと呼ぶ
#      
def count():
    #     ,            
    fs = []
    for i in range(1,4):
        #        f
        # f       
        def f():
            return i*i
        fs.append(f)
    return fs

f1,f2,f3 = count()
print(f1())
print(f2())
print(f3())

出力は次のとおりです.
9
9
9

問題:上記のような状況になったのは、戻り関数が変数iを参照しているためであり、iはすぐに実行されるのではなく、3つの関数が戻ってくるまで統一的に使用されるためであり、このときiはすでに3になり、最終的に呼び出されたとき、3*3が返されるという問題が、閉パケットを返すとき、戻り関数は循環変数ソリューションを参照できません.循環変数の現在の値をパラメータでバインドする関数を作成します.循環変数が後でどのように変更されても、バインドされた関数のパラメータ値は変更されません.
#       
def count2():
    def f(j):
        def g():
            return j*j
        return g
    fs = []
    for i in range(1,4):
        fs.append(f(i))
    return fs

f1,f2,f3 = count2()
print(f1())
print(f2())
print(f3())

出力構造:
1
4
9