0

重複の可能性:
Pythonの「驚き最小の原則」:可変のデフォルト引数

次のコードは問題を示しています。

def fn(param, named_param={}, another_named_param=1):
    named_param[param] = str(another_named_param)
    another_named_param += param
    return named_param

for i in range(0, 2):
    result = {}
    result = fn(i)

    print result

print

for i in range(0, 2):
    result = fn(i, named_param={})

    print result

print

result = fn(0)
print result
result = fn(1)
print result

出力:

{0: '1'}
{0: '1', 1: '1'}

{0: '1'}
{1: '1'}

{0: '1', 1: '1'}
{0: '1', 1: '1'}

forループの値と一致するparamを使用した1番目、2番目のループ、および後続の2つの単一呼び出しの出力は、同じテキスト出力になると予想しましたが、明示的にデフォルトで空の辞書に設定されていない場合はfn、の値を保持します。named_paramドキュメントで機能が定義されていますか?

4

1 に答える 1

1

のデフォルト値はnamed_param、関数定義が実行されるときに1回評価されます。これは毎回同じディクショナリであり、その値は関数の呼び出し間で保持されます。

変更しない限り、関数のデフォルト値として変更可能なオブジェクトを使用しないでください。代わりに、Noneまたは別の番兵値を使用し、その値を確認して、新しいオブジェクト(空の辞書など)に置き換えます。このようにして、関数が呼び出されるたびに新しいものを取得します。

于 2012-10-24T18:23:44.280 に答える