最終更新日:2026年10月2日
fe fe-technology programming trace
まず結論
値呼出し(call by value)は、引数の値をコピーして、呼び出された関数の仮引数へ渡す方式です。
仮引数に別の値を代入しても、呼出し元の変数には書き戻されません。 科目Aでは「値のコピー」「元の変数を変更しない」という説明が判断の合図になります。
ここでいう「変更しない」は、仮引数への代入による影響の話です。関数がグローバル変数や共有オブジェクトを別の経路から変更することまで禁止する仕組みではありません。
直感的な説明
値呼出しは、元のメモを手元に残し、内容を写した別のメモを渡すイメージです。
元のメモに「10」と書いてあっても、渡したコピーを「99」に書き換えるだけなら、元のメモは「10」のままです。
参照呼出しでは、呼出し元と関数が同じメモを操作します。そのため、関数側で書き換えると呼出し元から見える値も変わります。
| 方式 | メモのイメージ | 関数側で書き換えると? |
|---|---|---|
| 値呼出し | 内容を写した別のメモ | コピーだけが変わる |
| 参照呼出し | 同じメモを別の名前で使う | 元のメモも変わる |
定義・仕組み
実引数と仮引数を分ける
関数を使う側を呼出し元、関数の処理を行う側を呼出し先といいます。サブルーチンも、呼び出して使うひとまとまりの処理です。
change(x) という呼出しと、change(p) という関数の定義を考えます。
| 用語 | この例 | 役割 |
|---|---|---|
| 実引数 | 呼出し時の x |
関数へ渡す変数や式 |
| 仮引数 | 関数内の p |
渡されたものを受け取るための名前 |
値呼出しでは、x が持つ値を p へコピーします。x と p を別々の変数として追うのが基本です。
整数を渡して、仮引数へ99を代入する
次は説明用の疑似コードです。← は代入を表します。実引数は整数の変数で、グローバル変数の変更などは行わないものとします。
change(p):
p ← 99
x ← 10
change(x)
同じ処理でも、引数の渡し方によって結果が異なります。
| 段階 | 値呼出し | 参照呼出し |
|---|---|---|
| 呼出し前 | x = 10 |
x = 10 |
| 受渡し直後 | 別の変数 p に10をコピー |
p が元の x を参照 |
p ← 99 の直後 |
p = 99、x = 10 |
p を通して x = 99 に変更 |
| 終了後 | x = 10、書戻しなし |
x = 99 |
操作して確認:どちらの値が変わる?
段階のボタンを順番に押してください。見るポイント:p ← 99 の後、呼出し元の x も変わるかどうか。
同じ代入を、二つの渡し方で比較
整数の x = 10 を渡し、関数内で p ← 99 を実行します。
値呼出し:別々の変数
呼出し元 x = 10
呼出し先 p はまだありません
値のコピーを渡します。
参照呼出し:同じ変数を参照
呼出し元 x = 10
呼出し先 p はまだありません
元の変数への参照を渡します。
呼出し前:どちらも x = 10 です。
科目Aでどう出る?
受渡し方式の説明を見たら、何を渡すか、いつ元の変数に反映するかを確認します。
| 方式 | 判断の合図 | 呼出し元の変数への影響 |
|---|---|---|
| 値呼出し | 引数の値をコピー | 仮引数への代入だけでは変わらない |
| 参照呼出し | 元の変数への参照を渡す | 仮引数への代入が元の変数にも反映される |
| 結果呼出し | 終了時に仮引数の値を書き戻す | 終了時に変わり得る |
| 名前呼出し | 引数の式を使用するたびに評価 | 変更されない保証はない |
結果呼出しは、関数の戻り値を返すことの別名ではありません。仮引数の最終的な値を実引数の変数へコピーする方式です。呼出し時にもコピーする「値結果呼出し」とも区別します。
名前呼出しは、引数を呼出し時に一度だけ値へ変換する方式ではありません。「使用時に評価する」というタイミングが切り分けのポイントです。
方式の説明は、Old Dominion University:Functions: Parametersと、結果呼出しを扱うRice University:引数の受渡しに関する講義資料でも確認できます。
科目Bでどう使う?
関数呼出しを追跡するときは、呼出し元の変数、仮引数、戻り値を分けて記録します。受渡し方式や配列・オブジェクトの扱いは、問題文と疑似言語の仕様に従います。
次の説明用疑似コードでは、整数を値呼出しで渡すものとします。
addOne(p):
p ← p + 1
return p
x ← 10
y ← addOne(x)
| 処理 | x | p | y |
|---|---|---|---|
x ← 10 |
10 | まだない | 未代入 |
| 値をコピーして呼び出す | 10 | 10 | 未代入 |
p ← p + 1 |
10 | 11 | 未代入 |
11を返し、y に代入 |
10 | 呼出し終了 | 11 |
終了後は x = 10、y = 11 です。p が11になったことと、x が11になることは別です。
もし x ← addOne(x) と書かれていれば、戻り値11を呼出し元で x に代入するため、最終的に x = 11 になります。これは仮引数からの自動的な書戻しではありません。
この読み方は、科目Bの「手続・関数の呼出し」「変数の変化の追跡」につながります。出題範囲と疑似言語の資料は、IPA:試験要綱・シラバスについてで確認できます。
呼出しが重なる処理を続けて学ぶ場合は、再帰関数の終了条件と戻り値の追い方へ進むと、呼出しごとの値を分けて追う練習になります。
よくある誤解・混同
値呼出しなら、関数による変更は何も起きない?
値呼出しで防げるのは、仮引数への代入が、そのまま呼出し元の変数への代入になることです。
たとえば、オブジェクトへの参照を値としてコピーした場合、参照先のオブジェクト本体まで複製したとは限りません。同じオブジェクトの内容を変更すれば、呼出し元からも変更が見えることがあります。
また、グローバル変数を直接変更する関数なら、引数の渡し方とは別に影響が発生します。「値呼出しだから副作用が一切ない」とは判断しません。
Pythonは、そのまま参照呼出しの例にできる?
Pythonでは、引数はオブジェクトを仮引数の名前に結び付ける形で渡されます。関数内で名前に別の値を代入することと、同じオブジェクトの内容を変更することを分けます。
| Pythonの関数内の操作 | 呼出し元への影響 |
|---|---|
仮引数に p = 99 と再代入 |
呼出し元の変数の結び付きは変わらない |
渡されたリストに p.append(99) |
同じリストの内容が変わる |
「リストが変わったから参照呼出し」と短絡しないことが大切です。Python公式FAQ:出力引数と引数の渡し方は、引数が代入によって渡され、呼出し元と呼出し先の名前が同じ変数になるわけではないと説明しています。
呼出し先で必ず新しいメモリ領域が作られる?
値呼出しは、値のコピーとして扱われるという意味上のルールです。実際にどのメモリ領域やレジスタを使うかは、言語処理系や最適化によって異なります。
試験では、新しい領域の確保方法よりも、仮引数への代入が元の変数に反映されるかを見ます。
まとめ(試験直前用)
- 値呼出しは、引数の値をコピーして渡す方式
- 仮引数への代入だけでは、呼出し元の変数は変わらない
- 参照呼出しは元の変数を参照し、結果呼出しは終了時に書き戻す
- 関数の戻り値と、引数を通した書戻しを分ける
- 共有オブジェクトの内容変更は、仮引数への再代入とは別に考える