http://www.amazon.co.jp/dp/4873117380 のP115よりメモ
pythonの関数定義の際、引数にデフォルト値を設定することができるが、デフォルト値の値が計算されるのは、関数が実行された時ではなく、定義されたとき。
そのため次のように関数定義すると、リストは空ではなく、2回目以降では、前回呼び出した時の値が残る
In [32]: def buggy(arg, result=[]):
....: result.append(arg)
....: print(result)
....:
In [33]: buggy('a')
['a']
In [34]: buggy('b')
['a', 'b']
できるだけ、デフォルト値にはイミュータブルなものを指定することがバグを防ぐポイント。
これを回避するには、いろいろあるが、次のように最初の呼出であることを明示的にするなど。
In [35]: def nonbuggy(arg, result=None):
....: if result is None:
....: result = []
....: result.append(arg)
....: print(result)
....:
In [36]: nonbuggy('a')
['a']
In [37]: nonbuggy('b')
['b']