こんにちは!Kredo Blog編集部のさおりです!
AIに「このバグを直して」と頼んだのに、別の場所まで変わったり、「こちらでは再現しません」と返ってきたり。そんなときは、依頼文を長くする前に、同じ不具合が起きる短いコードを用意してみましょう。
今回は、Pythonの「1回目は正常に見えるのに、2回目から前のメモが混ざる」問題を使います。不具合の再現、AIへ渡す情報、修正候補の比較まで、実行結果と一緒に確かめます。コードが短くなっても、問題が起きる呼び出し順序は残すのがポイントです。
最小再現コードは、同じ問題が起きる小さな例

最小再現コードとは、不具合を調べるために、必要な部分へ絞った実行できる例のことです。英語ではminimal reproducible example、略してMREと呼ばれます。
短さだけで決めるものではありません。Stack Overflowの公式ヘルプでは、必要な部分を絞ること、再現に必要なものを含めること、実際に同じ問題が起きるか試すことが示されています。参考:How to create a Minimal, Reproducible Example
たとえば、長いアプリから関数だけを抜き出しても、どの値を渡したかがなければ相手は試せません。「2回目だけおかしい」なら、1回目からの順番も必要です。
| 残す情報 | この教材で用意するもの |
|---|---|
| 実行するコード | メモをリストへ追加するadd_note関数 |
| 入力と順番 | 「朝のメモ」、次に「夜のメモ」で呼び出す |
| 期待する結果 | 省略時は、呼び出しごとに別のリストになる |
| 実際の結果 | 2回目の結果に1回目のメモも含まれる |
| 試す環境と実行方法 | Pythonのバージョン、実行するファイルとコマンド |
作業は元のコードのコピーや別の練習ファイルで行います。少し削るたびに実行し、同じ問題が残っているかを確認してください。必要な設定・初期データ・処理順まで消してしまったら、直前の状態へ戻して切り分けます。
まず、2回目にメモが混ざる問題を再現する
最小再現コードの練習教材をダウンロードする(ZIP)を専用フォルダーへ展開します。修正前・修正候補・修正版、確認用コード、依頼文、実行結果、READMEが入っています。Python 3を使い、追加パッケージは不要です。
次は、教材のbroken.pyです。labelは追加する文字列、notesは追記先のリストです。
def add_note(label, notes=[]):
notes.append(label)
return notes
if __name__ == "__main__":
print(add_note("朝のメモ"))
print(add_note("夜のメモ"))
展開したフォルダーをターミナルで開き、ファイル全体を一度実行します。使っているPython 3のコマンドがpythonやpyなら、python3を置き換えてください。
python3 -B broken.py
実際の出力:
['朝のメモ']
['朝のメモ', '夜のメモ']
この教材で期待している2行目は['夜のメモ']です。ところが、実際は「朝のメモ」も残っています。例外が表示されず、実行が最後まで進んでいても、期待どおりとは限りません。
呼び出しを1回だけにすると、問題が見えなくなる
最初の一行だけなら、['朝のメモ']が出て正常に見えます。だから、この例では同じ関数を定義した状態で、続けて2回呼ぶことを残します。対話画面で毎回関数を定義し直すなど、条件を変えてしまうと、同じ比較になりません。
if __name__ == "__main__":より下は、このファイルを直接実行したときの確認用コードです。教材のテストから関数を読み込むときには、この表示処理を実行しないようにしています。-Bは、教材を試す際のバイトコードキャッシュ作成を抑えるための指定です。
AIには、実測値と変えたくない条件を渡す
不具合を確認したら、コードに加えて「何を期待しているか」「どこは今の使い方を保ちたいか」を書きます。この練習では、次の仕様に合わせて直します。
notesを省略したときは、毎回新しいリストを作る。- 前の呼び出しが返したリストへ、後の呼び出しの内容を混ぜない。
- リストを明示して渡したときは、そのリスト自身へ追記し、同じリストを返す。空のリストも対象にする。
Noneを明示した場合は、省略時と同じく新しいリストを作る。
「渡したリストを書き換えず、コピーを返す」仕様も考えられますが、この教材では採用していません。どちらを期待しているかを先に決めると、修正候補を判定できます。
次の依頼文には、短いコード・実測値・期待値がそろっています。実際に使う際は、自分の環境で確認した情報へ置き換えてください。
Pythonの関数で、2回目の結果に1回目のメモが混ざります。
原因の根拠と、必要最小限の修正を説明してください。
実行環境:Python 3.12.14、macOS
実行方法:以下をbroken.pyへ保存し、python3 -B broken.pyでファイル全体を実行
再現コード:
def add_note(label, notes=[]):
notes.append(label)
return notes
print(add_note("朝のメモ"))
print(add_note("夜のメモ"))
期待する出力:
['朝のメモ']
['夜のメモ']
実際の出力:
['朝のメモ']
['朝のメモ', '夜のメモ']
修正後に必要な条件:
・notesを省略するかNoneを渡すと、呼び出しごとに新しいリストを返す。
・後の呼び出しで、前に返したリストの内容を変えない。
・notesにリストを渡すと、そのリスト自身へ追記して同じリストを返す。
・空のリストを明示して渡した場合も、同じリストへ追記する。
・labelは文字列、notesは省略・None・リストを使う教材。
・関数名と、文字列を追記する用途は変えない。
回答してほしいこと:
1. 原因と、その説明を確かめられるPython公式資料
2. 小さな修正差分と理由
3. 元の再現手順、および明示した空リストを使う確認方法
4. 実行した確認と、まだ実行していない確認の区別
これは練習用の依頼文です。実際に使う際は、環境・コード・期待値・実測値を自分で確認した内容へ置き換えてください。
コードは、必要な部分をコピーできるテキストで渡します。表示崩れなら画面画像も役立ちますが、コードの画像だけでは、同じコードを実行して確かめにくくなります。実務のコードやログを使う場合は、共有できる範囲を確かめ、認証情報や個人情報を架空データへ置き換えた後でも問題が再現するか試してください。
この依頼文は独自の教材で、どのAIでも同じ回答が返ることを保証するものではありません。以下の修正候補も記事用に作成して実行したもので、特定のAIサービスから実際に得た回答という扱いではありません。
修正は小さく行い、原因と変更点を結び付ける

今回の原因は、引数の初期値に使った[]が、呼び出すたびに新しく作られるわけではないことです。Pythonのデフォルト値は関数を定義したときに評価されます。リストのように中身を変更できる値を初期値にして追記すると、後の呼び出しにも内容が残ります。参考:Python公式チュートリアルのデフォルト引数
教材のfixed.pyでは、初期値をNoneにして、省略時またはNoneを受け取ったときに、関数の中で新しいリストを作ります。
def add_note(label, notes=None):
if notes is None:
notes = []
notes.append(label)
return notes
if __name__ == "__main__":
print(add_note("朝のメモ"))
print(add_note("夜のメモ"))
python3 -B fixed.pyで、修正前と同じ順番で2回呼んだ結果:
['朝のメモ']
['夜のメモ']
2回目の出力に「朝のメモ」は含まれなくなりました。appendで追記してリストを返す部分はそのままです。明示して渡されたリストは、ここでは新しいリストに置き換えません。
AIの説明がもっともらしくても、修正前と同じ入力・順番で試す工程は残します。変更した部分が原因とどう関係するかを、自分の言葉で一文説明できるかも確認してみてください。
最初の不具合が直っても、別の使い方を試す

次は、見落としやすい別の修正候補です。if notes is None:の代わりに、if not notes:を使っています。省略時の呼び出しだけを見れば、問題が直ったように見えます。
def add_note(label, notes=None):
if not notes:
notes = []
notes.append(label)
return notes
if __name__ == "__main__":
provided = []
result = add_note("共有メモ", provided)
print("返された値:", result)
print("渡したリスト:", provided)
print("同じリスト:", result is provided)
python3 -B candidate_truthy.pyの実行結果:
返された値: ['共有メモ']
渡したリスト: []
同じリスト: False
返された値にはメモがあるのに、渡したprovidedは空のままです。空のリストもif not notesの条件に当てはまり、新しいリストへ置き換えられたためです。この教材の「渡したリスト自身へ追記する」という条件には合いません。
値が同じかだけでなく、同じリストを使っているかを確認する理由が、ここにあります。教材のテストでは、内容の比較にassertEqual、同じオブジェクトかの比較にassertIsを使っています。参考:Python公式unittest
同じ6項目で、3つの実装を比べる
次のコマンドで、教材の確認プログラムを実行できます。brokenとcandidate_truthyは、違いを観察するため意図的に不合格になる例です。
python3 -B check_notes.py broken
python3 -B check_notes.py candidate_truthy
python3 -B check_notes.py fixed
| 確認する振る舞い | 修正前 | if not版 | is None版 |
|---|---|---|---|
| 最初の呼び出しで1件を返す | 合格 | 合格 | 合格 |
| 2回目に前のメモが混ざらない | 不合格 | 合格 | 合格 |
| 後から呼んでも最初の結果が変わらない | 不合格 | 合格 | 合格 |
| 渡した空リスト自身へ追記する | 合格 | 不合格 | 合格 |
| 渡したリストの既存メモを残して追記する | 合格 | 合格 | 合格 |
| Noneを明示しても毎回別のリストになる | 例外発生 | 合格 | 合格 |
実行した結果、修正前は3/6項目、if not版は5/6項目、is None版は6/6項目で条件を満たしました。修正前の最後の項目ではAttributeErrorになっています。例外発生と、実行できても値が違う不合格は、ログでも分けて記録しています。
修正版のテスト結果の末尾:
Ran 6 tests in 0.000s
OK
テスト所要時間の数字は、実行する環境によって変わります。また、この6項目の合格は、決めた仕様に対する確認結果です。入力型の誤り、同時実行、実際の画面や保存処理まで検証したことにはなりません。
元のコードへ戻した後も、実際の操作で確かめる
小さな例で直ったら、元のコードへ必要な変更を戻します。このとき、切り出した例だけを動かして作業を終えず、最初に問題を見つけた操作を元の環境でも行います。
- 元のコードとの差分を見て、必要な変更だけを反映する。
- 最初に問題が起きた入力・順番で、もう一度試す。
- もともと動いていた使い方も試す。今回なら、追記先のリストを渡す場合。
- 期待値と実測値、試した環境、まだ試していない範囲を残す。
今回の配布物は、関数の動きを確かめる小さな教材です。既存の業務アプリへ実装して確認した、という実績ではありません。画面入力・保存・再読み込みを含むアプリの確認は、AIで作ったアプリのテスト方法へ進むと、別の範囲を練習できます。
AIへ追加の質問をするときも、「まだ直りません」だけでなく、新しく試した手順と結果を添えます。英語で報告する必要があるなら、英語のバグ報告テンプレートで、期待する動作と実際の動作を整理してください。
練習:再現に必要な情報を選んでみる
問題1:どちらの例をAIへ渡しますか?
Aは、add_noteを1回だけ呼び、正常な結果を表示するコード。Bは、同じ関数を続けて2回呼び、2回目に前のメモが混ざるコードです。
解答:Bです。今回の問題が起きる順番を再現できています。短くするために2回目の呼び出しを消すと、調べたい現象も消えてしまいます。
問題2:if not版は5項目通ったので、採用してよいですか?
この教材では、空のリストを明示して渡した場合も、そのリスト自身へ追記する必要があります。
解答:そのままでは採用できません。必要な1項目が不合格です。合格数だけでなく、どの条件が満たされていないかを見ます。
問題3:再現コードでは直りました。報告に何を残しますか?
解答例:「Python 3.12.14の教材で、同じ2回の呼び出しと6項目のテストを実行し、修正版はすべて合格。元アプリへの反映と画面操作は未確認」。試した範囲を具体的に書きます。
AIへのバグ修正依頼でよくある質問
エラーメッセージがないと、バグを説明できませんか?
説明できます。この例も、最初の2回の実行では例外が出ません。期待していたリストと、実際に出たリストの違いが手がかりになります。例外が出る場合は、種類とメッセージを原文で残しましょう。Pythonの英語エラーを読む練習も参考になります。
何行まで短くすれば、最小再現コードですか?
決まった行数ではありません。同じ問題を再現するために必要な処理・入力・設定があり、余分な部分を減らせているかで考えます。名前やインデントまで削って読みにくくする必要はありません。
AIにテストも作ってもらえば十分ですか?
テスト作成の補助には使えます。ただ、AIが解釈した仕様に合わせたテストだけでは、こちらが必要な条件を落とす場合があります。今回なら「空のリストを渡したら、そのリストへ追記する」という条件が含まれているか、自分でも見比べます。
次に修正を頼むときは、「実行する短いコード」「期待値」「実測値」の3つを先にそろえてみてください。返ってきた修正は同じ条件で動かし、残したい使い方も確かめる。この往復を小さくすると、どこが変わって直ったのかを追いやすくなります。
一次資料・実行確認:2026年10月6日。教材はPython 3.12.14/macOSで実行。コード・メモ・依頼文は独自の練習用です。写真・水彩図解はAI生成の学習イメージで、実在の受講生や勤務先の記録ではありません。
英語でIT・AIを学べるKredo
英語×IT・AIのスキルを身につけてグローバルに活躍しませんか?
当メディアを運営しているKredoは、英語×ITをオンラインで学ぶ「Kredoオンラインキャンプ」と、フィリピンのセブ島で英語とIT・AIを学ぶ「KredoIT留学」「KredoAI留学」を提供しています。これまでの卒業生は3,000名以上。卒業生の多くが、国内外のIT企業への転職、フリーランスなどへのキャリアチェンジを実現しています。これからの時代に必要な英語×IT・AIのスキルを身につけてグローバルに活躍しませんか?









