Pythonでリストやマップのデフォルト引数を指定する

Pythonで関数のデフォルト引数としてリストやマップを指定する方法


Pythonでは関数のデフォルト引数としてmutableな型 (リストやマップ)を指定するのは避けるべきです。それは、デフォルト引数が関数オブジェクトにバインドされた変数のため、関数内で変更された場合それが次回以降の呼び出し時にも引き継がれます

import random


def add_rand(d=[]):
    d.append(random.randint(10, 100))
    return d


def main():
    print(add_rand())
    print(add_rand())
    print(add_rand([0]))
    print(add_rand())

上記コードの実行結果は

[55]           <- 最初の呼び出しは空リストに変数が追加されている
[55, 14]       <- !次の呼び出しでは前回の値の後ろに値が追加
[0, 65]        <- 引数を指定するとデフォルト引数は使用されない
[55, 14, 75]   <- !2回目の呼び出しにさらに追加

文法的にはエラーになりませんが、非常に混乱を招きやすいコードになってしまいます。

リストやマップのデフォルト引数を指定したい場合は次のようにNoneで受けて、関数内でデフォルト値を設定するのがいいそうです

def add_rand_ok(d=None):
    if d is None:
        d = [-1]
    d.append(random.randint(10, 100))
    return d

おすすめ