6:リストや辞書をデフォルト引数にしない

Pythonのデフォルト引数は便利な機能ですが、使ううえでの罠があります。 次の例のようにプログラムを書いたことはありませんか?

具体的な失敗

def foo(values=[]):
    values.append("Hi")
    return values

引数 values をデフォルトで空のリストにしたい場合に values=[] と書いてはいけません。

cover

(中略)詳細は書籍 自走プログラマー をご参照ください

ベストプラクティス

更新可能(mutable)な値はデフォルト引数に指定してはいけません。 リスト、辞書、集合をデフォルト引数にしてはいけないと覚えておきましょう。 デフォルト引数に None を設定しておいて、関数内で None の場合に空のリストや辞書を指定しましょう。

def foo(values=None):
    if values is None:
        values = []
    values.append("Hi")
    return values

これで foo() を何回呼び出しても常に ["Hi"] が返ります。