コース一覧
    Pythonループ・関数
    変数のスコープ

    Pythonループ・関数

    ループと関数の基本を学び、繰り返し処理を分割して読みやすく書けるようにします。

    1
    ループ
    01. forで合計15分
    02. whileで繰り返す15分
    03. rangeとstep15分
    04. breakとcontinue15分
    05. enumerateで番号付け15分
    06. zipで組み合わせ15分
    07. 入れ子ループ15分
    08. つくる:何件でも記録15分
    09. 第5章クイズ10分
    2
    関数
    01. 関数を定義する15分
    02. 引数と戻り値15分
    03. デフォルト引数15分
    04. キーワード引数15分
    05. 複数の戻り値15分
    06. divmod15分
    07. 変数のスコープ15分
    08. lambda関数15分
    09. つくる:関数に分割15分
    10. 第6章クイズ10分

    変数のスコープ

    スコープの内と外

    関数の外の変数を書き換えようとすると落ちる

    変数には「どこから見えるか」という範囲があります。これを スコープ と呼びます。関数の中で作った変数は関数の中だけで生き、関数が終わると消えます。関数ごとに使い捨ての作業台がある、と考えると分かりやすいです。

    外で作った変数を関数の中から読むことはできます。ところが書き換えようとすると、話が変わります。

    Python

    count = 0
    
    def add_one():
        count = count + 1
        return count
    
    print(add_one())

    UnboundLocalError になります。cannot access local variable 'count' where it is not associated with a value というメッセージです。

    理由は、Python が関数の中を先に読み、「この関数の中に count への代入がある」と判断して、count をこの関数の変数だと決めてしまうためです。関数の中の変数として扱われた count には、右辺で使おうとした時点でまだ何も入っていません。

    global で押し切らない

    先頭に global count と書けばエラーは消えます。しかしこの書き方はおすすめしません。関数の外の状態が、関数を呼ぶたびにこっそり変わるからです。どこで何が変わったのかを追えなくなり、規模が大きくなるほど手に負えなくなります。

    もっとよい直し方は、必要なものを引数で受け取り、結果を戻り値で返す ことです。

    Python

    def add_one(count):
        return count + 1
    
    count = 0
    count = add_one(count)
    count = add_one(count)
    print(count)

    2 が出ます。外の変数が変わるのは count = ... の行だけなので、どこで変わったかが 1 行で見えます。関数のほうは、外に何があるかを一切知らずに済みます。

    解説

    関数の外を書き換える関数は、書いた本人にしか動きが読めません。入口は引数、出口は戻り値。この形を守るだけで、あとから読める関数になります。

    元を壊さずに 1 件足す

    リストでも考え方は同じです。リストどうしは + でつなげます。

    Python

    print([1, 2] + [3])

    [1, 2, 3] が出ます。できるのは 新しいリスト で、左の [1, 2] は変わりません。渡されたリストをそのままにして、1 件足したものを返す形が、こうして書けます。

    戻り値を受け取り忘れると、新しいリストは捨てられて何も増えません。エラーが出ないぶん、いちばん気づきにくい間違いです。呼び出しの行に = があるかを必ず見ます。

    やってみよう

    関数 add_record(records, name, price, category) を実装してください。支出のリスト records に、{"name": name, "price": price, "category": category} という 1 件を足した 新しいリスト を return します。

    元の records は書き換えません。キーは name と price と category の 3 つで、綴りを変えると受け取る側が取り出せなくなります。

    手元では records = add_record(records, "りんご", 120, "食費") を 2 回続けて実行し、件数が 2 件に増えることを確かめてみてください。

    要件

    1. 関数名は add_record で、引数は records, name, price, category の 4 つ
    2. 1 件は {"name": ..., "price": ..., "category": ...} の形の辞書にする
    3. 新しい記録はリストの末尾に足す
    4. 元の records を書き換えず、新しいリストを返す

    ヒント

    records + [new_record] で、元を変えずに新しいリストが作れます

    1 件ぶんの辞書はキーを name と price と category の 3 つにします

    関数の外の変数を直接書き換えようとすると UnboundLocalError になります

    呼び出す側は records = add_record(records, ...) と結果を受け取ります

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/08/05·更新 2026/08/26

    関連レッスン

    • lambda関数

      名前のない小さな関数を式で書く。sorted の key に渡して金額順に並べ替える

    • つくる:関数に分割

      第6章の総仕上げ。件数・合計・残額・予算オーバー判定を辞書で返す summarize を作る

    • 第6章クイズ

      関数の定義と呼び出し、デフォルト引数、複数の戻り値、スコープ、lambda を5問で確認する

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • 関数処理に名前を付けて再利用できる単位
    • 変数データに名前をつけて参照する仕組み
    • スコープ変数が参照可能な範囲
    • 判断YES/NO 分岐を表す菱形
    • 引数位置引数=順番で渡す。
    • 戻り値呼び出し元への返答を表す点線矢印
    • リスト順序付きで複数の値を扱うデータ構造
    main.py
    エディタを読み込んでいます

    メモ

    変数のスコープ

    ⌘S で保存