第4章 制御構造ツール(40問中9問)
Python3基礎試験の関数:戻り値None・global・参照渡しの結果
第4章の関数は、呼び出した結果が何になるかを読み取る問題が中心です。このページでは、return文のない関数の戻り値、関数の中の代入とglobal文・nonlocal文、リストを渡したときの変化、関数に別名を付ける書き方を、Python 3.9.6で実際に実行した結果で確かめます。覚えるのは3つです。return がなければ None、関数内の代入は外に出ない、リストの中身の変更は呼び出し元に届きます。
このページは試験の学習用の整理です。公式の問題は転載せず、コードはすべて説明用に作った例です。
この記事の目次
公式情報の確認
試験日、料金、申込条件、試験方式など変動する情報は、公式情報を最終確認してください。 当サイトの一次情報確認日: 2026-09-18。
試験の出題範囲・実施要項は変動するため、受験前に公式情報を確認してください。
結論
- return 文のない関数、式のない return、末尾に到達した関数はどれも None を返す。print() は表示するだけで戻り値ではない
- 関数内の代入はローカル変数になり、外の変数は変わらない。書き換えたいときは global 文(外側の関数の変数なら nonlocal 文)で指定する
- 実引数は値渡しで、値とは常にオブジェクトへの参照。リストに append() すれば呼び出し元に反映され、引数名への再代入は反映されない
- 関数名は別の名前からも指せる。alias = double のあと alias(4) で呼べる
戻り値とNone
公式チュートリアルによると、return 文を持たない関数も値を返していて、その値は None と呼ばれます。return 文は値を返して関数を終了し、式を指定しない return は None を返します。関数本体の末尾に到達した場合も None を返します。
| コード | 実行結果 | ひとこと |
|---|---|---|
def show(x):
print(x)
r = show(3)
print(r) | 3
None | print() は表示するだけで、show の戻り値は None |
def double(x):
return x * 2
double(3) | 6 | return の値が戻り値になる |
def nothing(x):
return
print(nothing(3)) | None | 式のない return は None を返す。print() で見える |
def sign(x):
if x > 0:
return 'plus'
sign(5) | 'plus' | return に届けばその値 |
print(sign(-1)) | None | return に届かず末尾に到達すると None |
画面に表示されることと、値を返すことは別です。show(3) は 3 を表示しますが、戻り値を受け取った r は None です。公式チュートリアルも、None だけを書き出そうとするとインタープリタは通常出力を抑制するので、本当に出力したいなら print() を使うと説明しています。
関数の中の代入とglobal・nonlocal
公式チュートリアルによると、関数内で変数に値を代入すると、その値はローカルなシンボルテーブルに格納されます。変数を参照するときは、ローカル、外側の関数のローカル、グローバル、組み込み名の順に検索します。したがって、関数内からグローバル変数や外側の関数の変数を参照することはできますが、直接値を代入することはできません。ただし、global 文で指定した場合や nonlocal 文で指定した場合は例外です。
| コード | 実行結果 | ひとこと |
|---|---|---|
x = 10
def local_assign():
x = 5
local_assign()
print(x) | 10 | 関数内の代入はローカル変数。外の x は変わらない |
def read_only():
return x
read_only() | 10 | 参照だけならグローバル変数を読める |
def global_assign():
global x
x = 5
global_assign()
print(x) | 5 | global 文で指定すると外の x を書き換えられる |
def outer():
n = 0
def inner():
nonlocal n
n += 1
inner()
return n
outer() | 1 | nonlocal 文は外側の関数の変数を書き換える |
同じ名前に見えても、関数の中の x = 5 は新しいローカル変数を作る代入です。local_assign() を実行したあとも、外の x は 10 のままでした。global 文を書いた global_assign() だけが、外の x を 5 に変えます。
リストを渡したときの変化
公式チュートリアルによると、関数を呼び出す実引数は値渡し(call by value)で渡されますが、ここでの値とは常にオブジェクトへの参照のことで、オブジェクトの値そのものではありません。公式の脚注は、オブジェクトへの参照渡し(call by object reference)と言ったほうがより正確だと補足しています。
| コード | 実行結果 | ひとこと |
|---|---|---|
def add_item(lst):
lst.append(9)
a = [1, 2]
add_item(a)
print(a) | [1, 2, 9] | 同じリストを操作するので、呼び出し元にも反映される |
def rebind(lst):
lst = [0]
rebind(a)
print(a) | [1, 2, 9] | 引数名に別のリストを代入しても、呼び出し元の a は変わらない |
リストの中身を変える操作は呼び出し元に届き、引数名を別のリストに付け替えても届きません。add_item() は渡されたリストに append() するので、呼び出し元の a も [1, 2, 9] になります。rebind() は引数名 lst に別のリストを代入しただけなので、a は変わりません。
関数に別名を付ける
公式チュートリアルによると、関数定義は現在のシンボルテーブルで関数名と関数オブジェクトを関連付けます。他の名前も同じ関数オブジェクトを指すことができ、その名前を使って関数にアクセスできます。公式の例は f = fib のあと f(100) で呼び出しています。
| コード(double は上の例の関数) | 実行結果 | ひとこと |
|---|---|---|
alias = double
alias(4) | 8 | 別の名前から同じ関数を呼べる |
alias is double | True | 2つの名前は同じ関数オブジェクトを指す |
別名を付けても関数のコピーはできず、同じ関数オブジェクトを指します。alias is double が True になるのはそのためです。
Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)
試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。
よくある質問
return文がない関数の戻り値は何ですか?
公式チュートリアルによると、return 文を持たない関数も None という値を返します。式を指定しない return と、関数本体の末尾に到達した場合も None を返します。print(関数名(引数)) とすると None が表示されます。
関数の中でグローバル変数を書き換えるには、どうしますか?
公式チュートリアルによると、関数内からグローバル変数を参照することはできますが、直接値を代入することはできません。ただし、global 文で指定した場合は例外で、外側の関数の変数は nonlocal 文で指定します。
関数にリストを渡すと、元のリストは変わりますか?
公式チュートリアルによると、実引数は値渡しですが、ここでの値は常にオブジェクトへの参照です。そのため append() のようにリスト自体を操作すれば呼び出し元にも反映され、引数名に別のリストを代入しても呼び出し元は変わりません。
第4章の制御構造ツールは、何問出ますか?
このサイトが整理した公式の章別出題数では、40問中9問(22.5%)で、全章の中で最多です。if文、for文とrange()、break・continue、match文、関数の定義と引数が含まれます。
