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
最近のコメント