Python閉鎖の穴
5055 ワード
閉パッケージ(closure)関数が内部で定義され、内部の関数に外部関数のパラメータまたは局所変数が適用され、内部関数が戻り値として扱われると、関連パラメータと変数が戻り関数に保存され、この結果を閉パッケージと呼ぶ
出力は次のとおりです.
問題:上記のような状況になったのは、戻り関数が変数iを参照しているためであり、iはすぐに実行されるのではなく、3つの関数が戻ってくるまで統一的に使用されるためであり、このときiはすでに3になり、最終的に呼び出されたとき、3*3が返されるという問題が、閉パケットを返すとき、戻り関数は循環変数ソリューションを参照できません.循環変数の現在の値をパラメータでバインドする関数を作成します.循環変数が後でどのように変更されても、バインドされた関数のパラメータ値は変更されません.
出力構造:
#
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