6:リストや辞書をデフォルト引数にしない¶
Pythonのデフォルト引数は便利な機能ですが、使ううえでの罠があります。 次の例のようにプログラムを書いたことはありませんか?
具体的な失敗¶
def foo(values=[]):
values.append("Hi")
return values
引数 values
をデフォルトで空のリストにしたい場合に values=[]
と書いてはいけません。
(中略)詳細は書籍 自走プログラマー をご参照ください
ベストプラクティス¶
更新可能(mutable)な値はデフォルト引数に指定してはいけません。
リスト、辞書、集合をデフォルト引数にしてはいけないと覚えておきましょう。
デフォルト引数に None
を設定しておいて、関数内で None
の場合に空のリストや辞書を指定しましょう。
def foo(values=None):
if values is None:
values = []
values.append("Hi")
return values
これで foo()
を何回呼び出しても常に ["Hi"]
が返ります。