こちらの記事を自分にわかるように解説します。
同じ内容を書くことにはなりますがご容赦ください。
https://qiita.com/yuku_t/items/fd517a4c3d13f6f3de40
関数定義やクラスのinitでは引数のデフォルト値を設定できます。
この時、初期値を与えた引数の型がmutable型だった場合よろしくないことが起こります。
初期値あり関数(よくない例).py
def foo(bar=[]): # List型はmutableだよ、気をつけて!
bar.append('baz')
print(bar)
これをデフォルト値で実行すると
実行.py
>>> foo()
['baz']
>>> foo()
['baz', 'baz'] # あれ?
結果が変わってしまっている。
何故このようなことになるかというと、Pythonでは関数のデフォルト値は関数定義時にメモリが割り当てられるからである。
上記では、関数定義時に作成されたList型に対して、appendの操作を2度を行ったために、"baz"が2こ入ったのである。
この問題をクリアするには、
つまり、問題なくmutable型の引数に初期値を与えたい時には、関数定義時ではなく、関数呼び出し時にメモリが割り当てられるようにすれば良い。
つまり、関数内部で初期化を行う。
初期値あり関数(よい例).py
def foo(bar=None):
if bar is None:
bar = []
bar.append('baz')
return bar
immutable型引数に初期値を与えることは、問題ないです。
参考: https://qiita.com/makotoo2/items/fc3a617882916f9775f5