Tips

今日の開発Tips(2025-08-19)

今日のTipsは、Pythonでの関数引数のデフォルト値の注意点についてです。デフォルト値に可変オブジェクト(リストや辞書など)を使用する際の落とし穴と、その回避策を説明します。誤った使い方をすると予期せぬ動作の原因となるため、注意が必要です。適切なデフォルト値の設定により、コードの可読性と保守性を向上させることができます。

Pythonにおける関数引数のデフォルト値の落とし穴と回避策

関数にデフォルト引数を設定する際、リストや辞書などの可変オブジェクトをデフォルト値として使用すると、予期せぬ動作を引き起こす可能性があります。これは、デフォルト値が関数定義時に一度だけ評価されるためです。

問題点の例:

def add_item(item, items=[]):
    items.append(item)
    return items

print(add_item(1))  # 出力: [1]
print(add_item(2))  # 出力: [1, 2]  <- 予想外の挙動!

上の例では、itemsのデフォルト値は関数定義時に一度だけ作成されます。そのため、add_item関数を複数回呼び出すたびに、同じリストに追加されていきます。

回避策:

デフォルト値としてNoneを使用し、関数内でリストなどを初期化するのが一般的です。

def add_item(item, items=None):
    if items is None:
        items = []
    items.append(item)
    return items

print(add_item(1))  # 出力: [1]
print(add_item(2))  # 出力: [2]  <- 期待通りの挙動

注意点:

  • デフォルト値に不可変オブジェクト(数値、文字列、タプルなど)を使用する場合は、この問題は発生しません。
  • デフォルト値に可変オブジェクトを使用する必要がある場合は、上記のようにNoneで初期化し、関数内で適切に処理する必要があります。

おすすめポイント:

この方法を使うことで、関数呼び出しごとに独立したリストが作成され、予期せぬ状態を防ぎ、コードの信頼性を高めることができます。可変オブジェクトをデフォルト値に使う場合は、必ずこの点を考慮しましょう。