-1

重複の可能性:
ループ内でラムダを作成する

以下のコードでは、返されたクロージャーの配列のメンバーを呼び出すと、数値 4 が出力されます。

def go():
    x = []
    for i in range(5):
        def y(): print i
        x.append(y)

    return x

クロージャーの各メンバーがi、クロージャーが定義されたときの番号を出力するようにします。

4

1 に答える 1

4

これを回避する 1 つの方法は、デフォルトの引数を使用することです。

def y(i=i): 
    print i

デフォルトの引数は、関数が呼び出されるのではなく、作成されるときに評価されるため、これは期待どおりに機能します。

>>> i = 1
>>> def y(i=i): print i
... 
>>> i = 2
>>> y()
1

ちょっとした追加情報:

デフォルトが何であるかに興味がある場合は、.func_defaults属性 ( __defaults__python3.x 内) でいつでも調べることができます:

>>> y.func_defaults
(1,)

この属性も書き込み可能であるため、実際には、関数が作成された後に新しいタプルを配置することでデフォルトを変更できます。

于 2012-12-19T16:40:23.107 に答える