重複の可能性:
ループ内でラムダを作成する
以下のコードでは、返されたクロージャーの配列のメンバーを呼び出すと、数値 4 が出力されます。
def go():
x = []
for i in range(5):
def y(): print i
x.append(y)
return x
クロージャーの各メンバーがi
、クロージャーが定義されたときの番号を出力するようにします。
重複の可能性:
ループ内でラムダを作成する
以下のコードでは、返されたクロージャーの配列のメンバーを呼び出すと、数値 4 が出力されます。
def go():
x = []
for i in range(5):
def y(): print i
x.append(y)
return x
クロージャーの各メンバーがi
、クロージャーが定義されたときの番号を出力するようにします。
これを回避する 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,)
この属性も書き込み可能であるため、実際には、関数が作成された後に新しいタプルを配置することでデフォルトを変更できます。