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
は、遅延呼び出しと同様に、関数定義の形式で渡されます。
の例では明らかではありません。 リーリー関数の戻り値 r の r は変数と考えることができますが、この変数は関数の定義を保存します。
。関数の実際の呼び出しは後で x() を介して行われます
r は オブジェクト であり、このオブジェクトの type は関数です。
言い換えると、r は
のような関数型のオブジェクトです。1 は、整数 型のオブジェクト
'hi' は、 と同様に、
Stringを
リーリーfs.append(r())
に変更することもできますが、関数の意味が異なります。count()
関数を実行すると結果[1, 4, 9]
が返されるため、print f1(), f2(), f3()
を使用することはできなくなります。結果を出力します。理由は次のとおりです。これは
になります。g
ではなくg()
であることに注意してください。そのため、count()
を実行すると返されるものは、実際には[g1, g2, g3]
3 つのクロージャー関数を含むリストです。各クロージャー関数は異なる自由変数 (それぞれ 1、2、3) をバインドします。 )、このリストをf1, f2, f3
に展開した後、print f1(), f2(), f3()
を実行することは、3 つの関数を実行して結果を出力することと同等であるため、最終出力は1, 4, 9
f1 = fs[0] = r = g
だから
f1()