Python のデフォルトの引数は使い回しされる2021年10月29日 12時05分35秒

Python でも関数への引数に初期値を設定することが出来る。

実は、Python のデフォルト引数は関数の定義を評価するときに生成され、その後の呼び出しで使い回される。

デフォルト引数は関数呼び出しの度に構築されるわけでは無い。この動作は他の言語と比べても珍しい。

そこで、副作用が出てくる。デフォルト引数は一つの変数を使い回すので、関数内で変数を変更すると、副作用としてその値が反映され次の実行時に参照される。

具体的な事例としては、デフォルト引数にランダム値を使おうと思って、uuid() 等を渡しても、全ての呼び出しで同じ値を受け取る事になる。

Mutable Default Arguments または、変更可能なデフォルト引数を参照のこと。

Pythonのデフォルト引数は、関数が定義されているときに評価されます。関数が呼び出されるたびに(例えば、Rubyのように)評価されるのではありません。 つまり、変更可能なデフォルトの引数を使用してそれを変更すると、その関数への今後のすべての呼び出しのためにそのオブジェクトを変更してしまいます。

なお、定数を読み取り専用で使う分には何ら問題ないので、大半の場合には問題にならない事が多い。