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

第4章 制御構造ツール(40問中9問)

Python3基礎試験の関数:戻り値None・global・参照渡しの結果

第4章の関数は、呼び出した結果が何になるかを読み取る問題が中心です。このページでは、return文のない関数の戻り値、関数の中の代入とglobal文・nonlocal文、リストを渡したときの変化、関数に別名を付ける書き方を、Python 3.9.6で実際に実行した結果で確かめます。覚えるのは3つです。return がなければ None、関数内の代入は外に出ない、リストの中身の変更は呼び出し元に届きます。

このページは試験の学習用の整理です。公式の問題は転載せず、コードはすべて説明用に作った例です。

公式情報の確認

試験日、料金、申込条件、試験方式など変動する情報は、公式情報を最終確認してください。 当サイトの一次情報確認日: 2026-09-18。

試験の出題範囲・実施要項は変動するため、受験前に公式情報を確認してください。

結論

  1. return 文のない関数、式のない return、末尾に到達した関数はどれも None を返す。print() は表示するだけで戻り値ではない
  2. 関数内の代入はローカル変数になり、外の変数は変わらない。書き換えたいときは global 文(外側の関数の変数なら nonlocal 文)で指定する
  3. 実引数は値渡しで、値とは常にオブジェクトへの参照。リストに append() すれば呼び出し元に反映され、引数名への再代入は反映されない
  4. 関数名は別の名前からも指せる。alias = double のあと alias(4) で呼べる

戻り値とNone

公式チュートリアルによると、return 文を持たない関数も値を返していて、その値は None と呼ばれます。return 文は値を返して関数を終了し、式を指定しない return は None を返します。関数本体の末尾に到達した場合も None を返します。

コード実行結果ひとこと
def show(x): print(x) r = show(3) print(r)3 Noneprint() は表示するだけで、show の戻り値は None
def double(x): return x * 2 double(3)6return の値が戻り値になる
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))Nonereturn に届かず末尾に到達すると 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)5global 文で指定すると外の x を書き換えられる
def outer(): n = 0 def inner(): nonlocal n n += 1 inner() return n outer()1nonlocal 文は外側の関数の変数を書き換える

同じ名前に見えても、関数の中の 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 doubleTrue2つの名前は同じ関数オブジェクトを指す

別名を付けても関数のコピーはできず、同じ関数オブジェクトを指します。alias is double が True になるのはそのためです。

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

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

PR

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

よくある質問

return文がない関数の戻り値は何ですか?

公式チュートリアルによると、return 文を持たない関数も None という値を返します。式を指定しない return と、関数本体の末尾に到達した場合も None を返します。print(関数名(引数)) とすると None が表示されます。

関数の中でグローバル変数を書き換えるには、どうしますか?

公式チュートリアルによると、関数内からグローバル変数を参照することはできますが、直接値を代入することはできません。ただし、global 文で指定した場合は例外で、外側の関数の変数は nonlocal 文で指定します。

関数にリストを渡すと、元のリストは変わりますか?

公式チュートリアルによると、実引数は値渡しですが、ここでの値は常にオブジェクトへの参照です。そのため append() のようにリスト自体を操作すれば呼び出し元にも反映され、引数名に別のリストを代入しても呼び出し元は変わりません。

第4章の制御構造ツールは、何問出ますか?

このサイトが整理した公式の章別出題数では、40問中9問(22.5%)で、全章の中で最多です。if文、for文とrange()、break・continue、match文、関数の定義と引数が含まれます。

次に読むと効率的なページ

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