Blog Post

Python のデフォルト値に mutable を使っちゃダメ!


作成日 2023-02-25

目次

概要

Python で list, dictionary, class のような mutable オブジェクトを引数のデフォルト値として使用することを見かけますが、なぜそれがダメかを説明します。

ダメな理由

mutable を引数のデフォルト値として使用した場合、 デフォルト値が記録されるからです。

例えば、以下のような関数があったとします。

def test(x=[]):
    x.append(1)
    return x

上記を実行すると以下の通りになります。

>>> test()
[1]
>>> test()
[1,2]

つまり、デフォルト値が変わってしまっています。

対策

ではどうすればいいか。

以下のように書きます。

def test(x=None):
    x = x or []
    return x

つまり、xNone (immutable) だったら新たに関数内で生成し、あったら x そのまま使用するという行を追加します。

上記はあくまでサンプルですが、他にも以下のような書き方もあります。

if x is None:
    x = []
x = x if x is not None else []

最後に

mutable オブジェクトをデフォルト値として使用することがダメかを説明しました。
基本的にダメですが、決してダメとは思いません。
例えば read only のオブジェクトでかつ可読性をあげたいとおなった場合はありかもと思います。 状況次第です。