関数のデフォルト値の初期化タイミング

この記事は Python Tips Advent Calendar 2012 20日目の記事です。


Python の関数にはデフォルト値が付けられます。
このデフォルト値は、その関数を呼び出したタイミングではなく、その関数を定義したタイミングで初期化されます。

>>> def f():
...     print 'called f'
...     return []
>>> def bar(x = f()): # この bar 関数の定義で f() が呼ばれる
...     x.append(1)
...     return x
called f
>>> bar() # この呼び出しのときには f() は呼ばれない
[1]
>>> bar() # 同じデフォルト値を使っているので、前回のリストが残ったままになっている
[1, 1]
>>> bar()
[1, 1, 1]

このようになります。
もし呼び出したタイミングでデフォルト値を決めたいなら、その引数に通常入ってこない定数と比較するのが一般的なようです。

>>> def bar(x = None):
...     x = x or f() # x が False として評価できる値だったら f() を代入する
...     x.append(1)
...     return x
>>> bar()
called f
[1]
>>> bar()
called f
[1]


.