LoginSignup
3
1

More than 3 years have passed since last update.

Pythonでデフォルト引数を使う際に気を付けること

Last updated at Posted at 2020-10-04

はじめに

使用歴が浅いPythonなのですが、
デフォルト引数の仕様を知らずにちょっとハマってしまいました。

デフォルト引数で指定した値はキャッシュされる

実は、デフォルト引数で指定した値はキャッシュされるため、これを知らずにデフォルト引数にリストや辞書のようなミュータブルデータを使うと意図しない動作になってしまう。

# aがデフォルト引数
def hoge(a=[]):
  a.append('a')
  print(a)

hoge() # ['a']
hoge() # ['a', 'a'] ※['a']ではない

上記を実行した場合、2回目のhoge()呼び出しでa = ['a']ではなく['a', 'a']となってしまう。
これは、1回目の呼び出し後の['a']が使い回されているため。

解決策

デフォルト引数に、Noneや数値や文字列、タプルなどのイミュータブルな値を使うようにする。

どうしてもデフォルト引数にリストや辞書を使いたい場合は、以下のような方法を用いると良い。

def hoge(a=None):
  if a is None:
    a = []
  a.append('a')
  print(a)

hoge() # ['a']
hoge() # ['a']
3
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1