はじめに
使用歴が浅いPythonなのですが、
デフォルト引数の仕様を知らずにちょっとハマってしまいました。
デフォルト引数で指定した値はキャッシュされる
実は、デフォルト引数で指定した値はキャッシュされるため、これを知らずにデフォルト引数にリストや辞書のようなミュータブルデータを使うと意図しない動作になってしまう。
# aがデフォルト引数
def hoge(a=[]):
a.append('a')
print(a)
hoge() # ['a']
hoge() # ['a', 'a'] ※['a']ではない
上記を実行した場合、2回目のhoge()呼び出しでa = ['a']ではなく['a', 'a']となってしまう。
これは、1回目の呼び出し後の['a']が使い回されているため。
解決策
デフォルト引数に、Noneや数値や文字列、タプルなどのイミュータブルな値を使うようにする。
どうしてもデフォルト引数にリストや辞書を使いたい場合は、以下のような方法を用いると良い。
def hoge(a=None):
if a is None:
a = []
a.append('a')
print(a)
hoge() # ['a']
hoge() # ['a']