【Python】レッスン3-3:スコープを理解しよう
一つ前のLessonでは関数の戻り値とデフォルト引数について学習しました。
今回はスコープの概念について見ていきます。
Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:関数とスコープ編
・Lesson3-1:関数の基本を理解しよう
・Lesson3-2:関数の戻り値とデフォルト引数を理解しよう
・Lesson3-3:スコープの概念を理解しよう ◁今回はココ
・Lesson3-4:高階関数を理解しよう
・Lesson3-5:無名関数を理解しよう
・練習問題3-1:丁半賭博ゲームを作ろう
・練習問題3-2:石取りゲームを作ろう
Lesson4:データ構造編
Lesson5:オブジェクト指向編
次のステップ:Python基礎習得者にお勧めの道5選(実務or副業)
スコープの基本|変数の有効範囲をわかりやすく解説
変数が「どこから見えるか/触れるか」を決める仕組みを スコープ と呼びます。
本記事では関数内で使う ローカルスコープ と、モジュール全体で共有される グローバルスコープ の基本を押さえ、参照可能範囲の違いをコンパクトに整理します。
「ローカルとグローバルの違いは?」「関数内から外の変数を使うとどうなる?」「代入した瞬間に何が起きる?」といった初学者の疑問に答えつつ、最短の実例で理解を深めます。
さっそく本文へ進み、手を動かしながらスコープの要点を体得しましょう。
ローカルスコープとグローバルスコープの違い|参照範囲と使いどころ
スコープとは変数や関数が有効である範囲のことです。
Pythonには主に「ローカルスコープ」と「グローバルスコープ」の2種類のスコープが存在します。
これらのスコープは、プログラムのどこで変数が参照可能であるかを決定します。スコープの正しい理解は、プログラムが意図通りに動作するために非常に重要です。
ローカルスコープとローカル変数の解説と使用例
ローカルスコープは、関数の内部で定義された変数( ローカル変数 )に適用されます。
これらの変数は関数の外部からは参照できません。例えば、以下のコードでは、変数 `x` は関数内でのみ使用可能です。
def my_function(): x = 5 # 関数my_functionの中で定義されたローカル変数x print(x) my_function() # 関数my_functionの呼び出し。5と出力される print(x) # 関数の外から関数内のローカル変数にはアクセスできない。エラー: 'x' is not defined
関数の外にxが定義されていないため、xを出力しようとしてもエラーとなります。
ローカル変数xのローカルスコープ(有効範囲)は関数my_functionの中だけです。
グローバルスコープとグローバル変数の解説と使用例
グローバルスコープはプログラム全体で参照できる変数に適用されます。
関数の外部で定義された変数を グローバル変数 と呼び、グローバルスコープによって関数内からも参照することができます。
ただし、関数内からグローバル変数の値を変更するには、global
キーワード を使う必要があります。
x = 10 # 関数の外で定義されたグローバル変数x def show_value(): print(x) # グローバル変数xを関数内から参照 def change_value(): global x # グローバル変数xを関数内で変更するための宣言 x = 20 # グローバル変数xを関数内から上書き show_value() # 出力: 10 change_value() # 関数内でグローバル変数を上書き print(x) # 出力: 20
スコープに関連する注意点
スコープを扱う際に注意すべき点は、変数の再定義と影響範囲です。
特にグローバル変数はプログラム全体で参照されるため、思いがけないタイミングで値が変更されてしまうリスクがあります。
関数内でグローバル変数を変更する場合は、`global` キーワードを使うことが必要ですが、なるべく避け、ローカルスコープを適切に活用することが推奨されます。
また、Pythonでは同じ名前の変数を異なるスコープで定義することが可能ですが、それが意図的でない場合はバグの原因となることがあります。
まとめ|見える範囲を意識した関数設計へ
ここまでで、ローカルスコープ=関数内でのみ有効な名前、グローバルスコープ=モジュール全体で共有される名前という基本と、参照できる範囲の違いを整理しました。
この学習により、名前の見える範囲を意識した関数設計ができ、思わぬ上書きや参照エラーを避けながら、読みやすくテストしやすいコードを書けるようになります。
小さなスクリプトでも、変数を「どこで定義し、どこで使うか」を明確にするだけで、挙動が安定し理解もしやすくなります。
あとは実例を自分の手で少しずつ置き換えていきましょう。見える範囲をコントロールできるという自信が、次の一歩を支えてくれます。
- サイト改善アンケート|ご意見をお聞かせください(1分で終わります)
-
本サイトでは、みなさまの学習をよりサポートできるサービスを目指しております。
そのため、みなさまの「プログラミングを学習する理由」などをアンケート形式でお伺いしています。1分だけ、ご協力いただけますと幸いです。
【Python】サイト改善アンケート
練習問題:グローバル変数とローカル変数を使ってみよう
問題|グローバル変数とローカル変数の動きを理解しよう
グローバルスコープとローカルスコープの違いを学ぶためのプログラムを作成しましょう。
グローバル変数として「greeting」という文字列を定義し、関数内でその変数を表示します。また関数内で別のローカル変数を定義し、その値も表示しましょう。
さらに、グローバル変数の値を関数内で変更する処理を作成し、変更後の値が関数外でも反映されることを確認します。
以下の要件に従ってコードを完成させてください。
- グローバル変数
greeting
に「こんにちは」という文字列を格納し、関数の外と内でこの変数を表示すること。 - 関数
local_scope_function()
を定義し、ローカル変数message
に「これはローカル変数です」という文字列を代入し、それを表示すること。 - グローバル変数
greeting
の値を関数modify_global_variable()
の中で「こんにちは、世界!」に変更すること。 - 関数の外で変更後の
greeting
の値を表示すること。
ただし、以下のような実行結果となるコードを書くこと。
ローカル変数 message の値: これはローカル変数です グローバル変数 greeting の値: こんにちは グローバル変数 greeting が関数内で変更されました: こんにちは、世界! 関数外のグローバル変数 greeting の値: こんにちは、世界!
ヒント|難しいと感じる人だけ見よう
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
- ヒント1【コードの構成を見る】
-
正解のコードは上から順に以下のような構成となっています。
1:グローバル変数
greeting
の宣言2:二つの関数を定義
・1つ目の関数は引数なしで定義し、関数の内部でローカル変数に文字列を入れて表示する。
・同じ関数内で、外側の変数をそのまま参照して表示する(読み取りだけ)。
・2つ目の関数では、最初にglobal
と変数名を宣言してから、新しい文字列を代入する。
・代入後の値を、その関数の中で表示しておくと効果が確認しやすい。3:確認パート
・関数は定義した後に必ず呼び出す。
・実行順序は 表示用の関数 → 更新用の関数 → 最後の表示。
・最後の表示は関数の外で、グローバル変数をそのまま参照する。
・実行結果例の出力順と文面に合うように並びを意識する。
- ヒント2【穴埋め問題にする】
-
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
'''(穴埋め)グローバル変数 greeting に「こんにちは」を代入する行を書く''' def local_scope_function(): '''(穴埋め)''' = "これはローカル変数です" # ローカル変数messageの宣言 print(f"ローカル変数 message の値: {message}") print(f"グローバル変数 greeting の値: {greeting}") def modify_global_variable(): '''(穴埋め)''' greeting # グローバル変数greetingを使用するためにglobalキーワードを使用 greeting = "こんにちは、世界!" # グローバル変数を新しい値に変更 print(f"グローバル変数 greeting が関数内で変更されました: {greeting}") # 関数の実行 local_scope_function() # ローカル変数とグローバル変数の表示 modify_global_variable() # グローバル変数の値を変更 # グローバル変数の変更を確認 print(f"関数外のグローバル変数 greeting の値: {greeting}")
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
解答例|ローカルとグローバルの動作確認プログラム
例えば以下のようなプログラムが考えられます。
- 正解コード
-
greeting = "こんにちは" # グローバル変数greetingを宣言 def local_scope_function(): message = "これはローカル変数です" # ローカル変数messageの宣言 print(f"ローカル変数 message の値: {message}") print(f"グローバル変数 greeting の値: {greeting}") def modify_global_variable(): global greeting # グローバル変数greetingを使用するためにglobalキーワードを使用 greeting = "こんにちは、世界!" # グローバル変数を新しい値に変更 print(f"グローバル変数 greeting が関数内で変更されました: {greeting}") # 関数の実行 local_scope_function() # ローカル変数とグローバル変数の表示 modify_global_variable() # グローバル変数の値を変更 # グローバル変数の変更を確認 print(f"関数外のグローバル変数 greeting の値: {greeting}")
解答例の解説|ローカルとグローバルの動作確認プログラムの考え方
解答例の詳細解説は以下の通りです。
- 詳細解説
-
グローバル変数の定義
greeting = "こんにちは" # これはグローバルスコープの変数
ここでは、プログラム全体から参照できる変数を最初に用意します。
モジュールの一番外側で値を与えると、その名前は「グローバル変数」として関数の内側からも読めるようになります(関数内で値を読み取るだけなら追加の手続きは不要です)。
この値は、あとで関数が画面に表示したり、別の関数で更新したりする“共通の元データ”として使われます。二つの関数を定義
def local_scope_function(): message = "これはローカル変数です" # ローカル変数messageの宣言 print(f"ローカル変数 message の値: {message}") print(f"グローバル変数 greeting の値: {greeting}") def modify_global_variable(): global greeting # グローバル変数greetingを使用するためにglobalキーワードを使用 greeting = "こんにちは、世界!" # グローバル変数を新しい値に変更 print(f"グローバル変数 greeting が関数内で変更されました: {greeting}")
ここでは2つの役割の異なる関数を用意します。
1つ目は、関数の中だけで使えるローカル変数を作り、その値を表示します。
同じ関数の中で、外側にあるグローバル変数も読み取って表示します。グローバル変数を「読むだけ」であれば特別な手続きは不要です。
もう1つの関数は、外側のグローバル変数の中身を書き換える役割を持ちます。
関数の内部から外側の変数を書き換えるときは、あらかじめそれがグローバルであることを明示しないと、別のローカル変数として扱われてしまいます。
この区別ができると、表示と更新の振る舞いを意図どおりに制御できます。確認するパート
# 関数の実行 local_scope_function() # ローカル変数とグローバル変数の表示 modify_global_variable() # グローバル変数の値を変更 # グローバル変数の変更を確認 print(f"関数外のグローバル変数 greeting の値: {greeting}")
ここでは、これまでに用意した関数を実際に呼び出して動かします。
最初にローカル変数とグローバル変数の表示を行い、つづいてグローバル変数を更新する関数を実行します。
関数は定義しただけでは動かず、呼び出した順に処理が進む点が大切です。
更新後は関数の外から同じ名前を参照して値が変わっていることを確かめます。
これにより関数内の書き換えがモジュール全体に影響すること、そして実行順序が出力に直結することを体感できます。
スコープの疑問解消|FAQと用語のまとめ
初心者がつまずきやすいポイントをFAQとしてまとめ、またよく使う専門用語をわかりやすく整理しました。
理解を深めたいときや、ふと疑問に感じたときに役立ててください。
FAQ|スコープに関するよくある質問
- Q1. ローカル変数とグローバル変数の違いは何ですか?
-
ローカル変数は関数の中で定義され、その関数内でのみ有効です。一方、グローバル変数は関数外で定義され、プログラム全体でアクセス可能です。
- Q2. 関数内からグローバル変数を変更できますか?
-
global
キーワードを使うことで、関数内からグローバル変数の値を変更することができますが、プログラムの可読性や保守性に注意が必要です。
- Q3. スコープがバグの原因になることはありますか?
-
あります。意図せず同名の変数をローカルで再定義してしまった場合、元のグローバル変数にアクセスできず、想定外の挙動につながることがあります。
Python用語集|スコープに関する用語一覧
今回の記事で出てきた用語・関数などを一覧で紹介します。
このサイトに出てくる 全てのPython用語をまとめた用語集 も活用してください。
Python用語 | 定義・使い方の概要 |
---|---|
スコープ | 変数や関数が有効な範囲を指し、どこから参照・変更できるかを制御する概念 |
ローカルスコープ | 関数やブロック内で定義された変数が有効な範囲。外部からはアクセスできない |
ローカル変数 | ローカルスコープ内で定義された変数。関数内のみで有効 |
グローバルスコープ | プログラム全体で有効なスコープで、関数の外で定義された変数が属する |
グローバル変数 | グローバルスコープに属する変数で、関数内からも参照可能。ただし変更には制限がある |
global | 関数内でグローバル変数を明示的に変更するために使用するキーワード |