AI資格ドリル
資格を選ぶ↓

用語比較

デフォルト引数に空リストを書く場合とNoneを書く場合の違い|呼び出しをまたいで値が残るか(Python3基礎)

def f(a, L=[]) と def f(a, L=None) は、どちらも「リストを省略できる引数」に見えますが、動きが違います。L=[] のデフォルト値は関数を定義した時点で1回だけ作られ、呼び出しのたびに同じリストが使われます。L=None なら、関数の中で呼び出しごとに新しいリストを作れます。空リストは1回、None方式は毎回と覚えると、出力を読む問題で迷いません。

Python公式チュートリアル4.9.1は、この点を「重要な警告」として説明しています。デフォルト値は1度しか評価されず、リスト・辞書・多くのクラスのインスタンスのようなミュータブルなオブジェクトでは、呼び出されるたびに渡された引数を蓄積する、という内容です。

Python3エンジニア認定基礎試験は、公式チュートリアルの内容を章ごとの出題率で出題する形で、4.9「関数定義についてもう少し」を含む制御構造ツールの章も範囲です。この記事では、チュートリアルの例を使って、2つの書き方で出力がどう変わるかを確認します。

この記事の根拠と出典

各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。Python3エンジニア認定基礎試験の一次情報確認日: 2026-09-18。

結論

L=[](空リスト)

デフォルト値は定義時に1回だけ評価される。省略して呼ぶと毎回同じリストが使われ、f(1)・f(2)・f(3) の出力は [1]・[1, 2]・[1, 2, 3] になる。

L=None

デフォルト値のNoneは変更されない。関数の中で if L is None: L = [] と書くと、省略して呼ぶたびに新しいリストができ、前の呼び出しの値は残らない。

違いを表で確認

比較軸L=[](空リスト)L=None
デフォルト値が作られる時点関数を定義した時点で1回だけ評価されるNone自体は定義時に1回評価されるが、リストは関数の中で呼び出しごとに作る
引数を省略して続けて呼んだとき同じリストを使い続けるので、前の呼び出しの要素が残る呼び出しごとに新しいリストなので、前の要素は残らない
チュートリアルの例 f(1)・f(2)・f(3)[1]・[1, 2]・[1, 2, 3] を出力する呼び出しごとに新しいリストを作るので、それぞれ1つの要素だけのリストになる
チュートリアルが示す位置づけミュータブルなデフォルト値への「重要な警告」の対象後続の呼び出しでデフォルト値を共有したくない場合の書き方

Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)

試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。

PR

ほかの資格を含む参考書・問題集の一覧を見る

どこで迷っているかを切り分ける

01

同じ関数を続けて呼ぶと、結果が増えていく理由が分からない人

デフォルト値のリストが定義時に1回だけ作られ、省略した呼び出しがすべて同じリストに追加しているのが原因です。

02

L=None と書く理由が分からない人

Noneは変更されないため、関数の中で毎回新しいリストを作る目印として使えます。チュートリアルも、共有したくない場合の書き方として示しています。

03

整数や文字列のデフォルト値でも同じことが起きるか気になる人

チュートリアルが警告しているのは、リストや辞書のようなミュータブルなオブジェクトの場合です。この記事の例は、すべてリストです。

具体例で使い分ける

例 1

チュートリアル4.9.1の f(a, L=[]) を3回呼ぶ

def f(a, L=[]): に続けて L.append(a) と return L を書き、print(f(1))、print(f(2))、print(f(3)) と呼びます。2つ目の引数は毎回省略しています。

  • デフォルト値の [] は、def 文が実行された時点で1回だけ作られます。3回の呼び出しは、すべてこの同じリストを使います。
  • 1回目は [1]、2回目は同じリストに2を足して [1, 2]、3回目は [1, 2, 3] になります。公式チュートリアルの出力と一致します。
  • L=None に書き換えて if L is None: L = [] を入れると、省略した呼び出しごとに新しい空リストができます。コードの流れから、3回の出力は [1]・[2]・[3] になります。

結論: 出力が増えていくなら、デフォルト値が共有されています。毎回リセットしたいときは、デフォルトをNoneにして関数の中でリストを作ります。

問題文から答えを選ぶ手順

  1. 1

    デフォルト値がミュータブルかを見る

    = の右がリストや辞書なら、定義時に1回だけ作られて呼び出し間で共有されます。

  2. 2

    関数の中でその引数を書き換えているかを見る

    append などで中身を変えていれば、変更が次の呼び出しに残ります。

  3. 3

    呼び出しで引数を渡しているかを見る

    リストを渡した呼び出しは、そのリストを使います。デフォルト値が使われるのは省略した呼び出しだけです。

試験での見分け方

  • 1デフォルト値は関数を定義した時点で1回だけ評価される。
  • 2デフォルト値がリストや辞書などのミュータブルなオブジェクトなら、省略した呼び出しの間で共有される。
  • 3共有したくなければ、デフォルトをNoneにして、関数の中で if L is None: L = [] のように新しく作る。

誤答しやすい選択肢

デフォルト値は、呼び出しのたびに作り直されると考える

修正: チュートリアルは、デフォルト値は1度しか評価されないと説明しています。

L=None と書けば、Noneのまま追加できると考える

修正: Noneにはappendできません。関数の中で if L is None: L = [] のように、リストを作る処理が必要です。

リストを渡して呼んだときも、デフォルトのリストが増えると考える

修正: リストを渡した呼び出しは、渡したリストを使います。デフォルトのリストに追加されるのは、引数を省略した呼び出しです。

確認問題

Q1def f(a, L=[]) のデフォルト値 [] は、何回評価されるか?

答え: 関数を定義した時点で1回だけ

チュートリアル4.9.1は、デフォルト値は1度しか評価されないと説明しています。

Q2def f(a, L=[]): L.append(a); return L に対し、print(f(1))、print(f(2))、print(f(3)) の出力は?

答え: [1]、[1, 2]、[1, 2, 3]

3回とも同じデフォルトのリストが使われ、要素が蓄積されます。

Q3後続の呼び出しでデフォルト値を共有したくないとき、チュートリアルが示す書き方は?

答え: デフォルトをNoneにし、関数の中で if L is None: L = [] とする

呼び出しごとに新しいリストが作られるため、前の呼び出しの要素は残りません。

到達チェック

  • デフォルト値が定義時に1回だけ評価されることを説明できる
  • f(1)・f(2)・f(3) の出力が [1]・[1, 2]・[1, 2, 3] になる理由を説明できる
  • L=None と if L is None: L = [] の書き方で共有を避けられることを説明できる

同じ資格で次に知りたいこと

よくある質問

Qデフォルト引数に空リストを書いてはいけないのですか?

A

書けますが、省略した呼び出しの間で同じリストが共有されます。共有したくないときは、デフォルトをNoneにして関数の中でリストを作ります。

Qデフォルト値はいつ評価されますか?

A

関数を定義した時点で、定義している側のスコープで1回だけ評価されます。公式チュートリアル4.9.1の記述です。

QL=None のとき、なぜ if L is None と書くのですか?

A

引数が省略されたかどうかを調べ、省略されたときだけ新しいリストを作るためです。

QPython3基礎試験の範囲?

A

公式の出題範囲は公式チュートリアルの章単位で、4.9.1「デフォルト引数」は制御構造ツールの章に含まれます。出題の形式は受験前に公式の案内で確認してください。

次に見る比較

執筆: ミナト編集部(運営者情報を見る)