Pythonのスコープを理解しよう|変数の使い分け基礎【レッスン3-3】

ながみえ

一つ前のLessonでは関数の戻り値とデフォルト引数について学習しました。

今回はスコープの概念について見ていきます。

Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:関数とスコープ編
・Lesson3-1:関数の基本を理解しよう
・Lesson3-2:関数の戻り値とデフォルト引数を理解しよう
・Lesson3-3:スコープの概念を理解しよう ◁今回はココ
・Lesson3-4:関数を使いこなそう
・Lesson3-5:無名関数を理解しよう
・Lesson3-6:可変長引数を理解しよう
・Lesson3-7:デコレーターを理解しよう
・練習問題3-1:丁半賭博ゲームを作ろう
・練習問題3-2:石取りゲームを作ろう
Lesson4:データ構造編
Lesson5:オブジェクト指向編
次のステップ:Pythonを用いたアプリ開発

<<前のページ

【Python学習記事のアイキャッチ画像】Lesson3-2 関数の戻り値とデフォルト引数を理解しよう

Pythonの記事一覧

Python学習カテゴリの親ページ用アイキャッチ画像(テキスト&問題集)、記事一覧へのリンク案内

次のページ>>

【Python学習記事のアイキャッチ画像】Lesson3-4 関数の受け渡しを理解しよう

変数の有効範囲とは?スコープの基本をわかりやすく解説

この章ではPythonにおける「スコープ」の意味や使い方を学習します。必要ない方はここをクリックして練習問題へ飛びましょう。

【Python】勉強猫がノートパソコンを前にして学習を始める様子。記事内の学習スタート用イラスト

プログラミングにおいて「スコープ」という概念は、変数や関数が参照できる範囲を指します。

本記事ではPythonにおけるスコープの基本概念と、ローカルスコープおよびグローバルスコープについて解説します。

ローカルスコープとグローバルスコープ

スコープとは変数や関数が有効である範囲のことです。

Pythonには主に「ローカルスコープ」と「グローバルスコープ」の2種類のスコープが存在します。

これらのスコープは、プログラムのどこで変数が参照可能であるかを決定します。スコープの正しい理解は、プログラムが意図通りに動作するために非常に重要です。

ローカルスコープ

ローカルスコープは関数の内部で定義された変数に適用されます。

これらの変数は関数の外部からは参照できません。例えば、以下のコードでは、変数 `x` は関数内でのみ使用可能です。

def my_function():
    x = 5
    print(x)

my_function()  # 出力: 5
print(x)  # エラー: 'x' is not defined

関数の外にxが定義されていないため、xを出力しようとしてもエラーとなります。

グローバルスコープ

グローバルスコープはプログラム全体で参照できる変数に適用されます。

関数の外部で定義された変数をグローバル変数と呼び、グローバルスコープによって関数内からも参照することができます。

ただし、関数内からグローバル変数の値を変更するには、global キーワードを使う必要があります。

x = 10

def change_value():
    global x
    x = 20

change_value()
print(x)  # 出力: 20
注意点

global キーワードによって関数内からグローバル変数を変更する手法はミスを誘発しやすいため、できるだけ使用しない方が良いとされています。

スコープに関連する注意点

スコープを扱う際に注意すべき点は、変数の再定義と影響範囲です。

特にグローバル変数はプログラム全体で参照されるため、思いがけないタイミングで値が変更されてしまうリスクがあります。

関数内でグローバル変数を変更する場合は、`global` キーワードを使うことが必要ですが、なるべく避け、ローカルスコープを適切に活用することが推奨されます。

また、Pythonでは同じ名前の変数を異なるスコープで定義することが可能ですが、それが意図的でない場合はバグの原因となることがあります。

まとめ

【初心者向け】Pythonの関数の種類と使い方を分かりやすくまとめた概念図と使用例。 特に関数の呼び出しや戻り値、関数を変数に代入する例、引数として渡す例、無名関数、スコープについて視覚的に理解できるようまとめている。

Pythonにおけるスコープの概念を理解することは、プログラムが正しく動作するために不可欠です。

ローカルスコープとグローバルスコープの違いを理解し、`global` キーワードの使い方に注意しながら、変数の管理を適切に行いましょう。

練習問題:グローバル変数とローカル変数の動きを理解しよう

【Python】勉強猫がノートパソコンに向かい、練習問題に挑戦する様子。記事内の休憩用イラスト

グローバルスコープとローカルスコープの違いを学ぶためのプログラムを作成しましょう。

グローバル変数として「greeting」という文字列を定義し、関数内でその変数を表示します。また関数内で別のローカル変数を定義し、その値も表示しましょう。

さらに、グローバル変数の値を関数内で変更する処理を作成し、変更後の値が関数外でも反映されることを確認します。

問題の詳細条件

以下の要件に従ってコードを完成させてください。

  • グローバル変数 greeting に「こんにちは」という文字列を格納し、関数の外と内でこの変数を表示すること。
  • 関数 local_scope_function() を定義し、ローカル変数 message に「これはローカル変数です」という文字列を代入し、それを表示すること。
  • グローバル変数 greeting の値を関数 modify_global_variable() の中で「こんにちは、世界!」に変更すること。
  • 関数の外で変更後の greeting の値を表示すること。

ただし、以下のような実行結果となるコードを書くこと。

ローカル変数 message の値: これはローカル変数です
グローバル変数 greeting の値: こんにちは
グローバル変数 greeting が関数内で変更されました: こんにちは、世界!
関数外のグローバル変数 greeting の値: こんにちは、世界!

【ヒント】難しいと感じる人だけ見よう

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

Q
ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)

1:グローバル変数 greeting に「こんにちは」を代入
2:関数 local_scope_function の定義
  □ ローカル変数 message に「これはローカル変数です」を代入し、その値を表示
  □ グローバル変数 greeting の値を表示
3:関数 modify_global_variable の定義
  □ global キーワードを使ってグローバル変数 greeting を指定
  □ グローバル変数 greeting を「こんにちは、世界!」に変更し、その値を表示
4:関数 local_scope_function の実行
5:関数 modify_global_variable の実行
6:グローバル変数 greeting の変更後の値を関数外で表示

Q
ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

# グローバルスコープで変数greetingを定義
greeting = "こんにちは"  # これはグローバルスコープの変数

def local_scope_function():
    """【穴埋め問題1】
    ここにローカル変数messageを定義し、その値を表示するコードを書いてください。
    また、グローバル変数greetingの値を表示してください。
    """

def modify_global_variable():
    """【穴埋め問題2】
    ここでglobalキーワードを使ってグローバル変数greetingを指定し、値を「こんにちは、世界!」に変更して表示するコードを書いてください。
    """

# 関数の実行
local_scope_function()  # ローカル変数とグローバル変数の表示
modify_global_variable()  # グローバル変数の値を変更

# グローバル変数の変更を確認
print(f"関数外のグローバル変数 greeting の値: {greeting}")  # 変更後のグローバル変数の値が表示される

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

問題の答え合わせと解説

この問題の一つの正解例とそのコードの解説を以下に示します。

一つの正解例

例えば以下のようなプログラムが考えられます。

Q
正解コード
# グローバルスコープで変数greetingを定義
greeting = "こんにちは"  # これはグローバルスコープの変数

def local_scope_function():
    # これはローカルスコープでの変数定義
    message = "これはローカル変数です"  # この変数messageは関数の外では使えない
    print(f"ローカル変数 message の値: {message}")
    print(f"グローバル変数 greeting の値: {greeting}")

def modify_global_variable():
    # グローバルスコープの変数greetingを変更
    global greeting  # グローバル変数greetingを使用するためにglobalキーワードを使用
    greeting = "こんにちは、世界!"  # グローバル変数を新しい値に変更
    print(f"グローバル変数 greeting が関数内で変更されました: {greeting}")

# 関数の実行
local_scope_function()  # ローカル変数とグローバル変数の表示
modify_global_variable()  # グローバル変数の値を変更

# グローバル変数の変更を確認
print(f"関数外のグローバル変数 greeting の値: {greeting}")  # 変更後のグローバル変数の値が表示される

正解例の詳細解説

このコードでは、Pythonにおけるスコープの概念(変数の有効範囲)を理解するための例を示しています。

グローバル変数とローカル変数の違いを中心に解説します。

Q
詳細解説

グローバル変数の定義

greeting = "こんにちは"  # これはグローバルスコープの変数

最初に定義されている greetingグローバル変数です。グローバル変数はプログラム全体で使用可能で、関数の外部に定義されます。

この変数はどの関数からもアクセスでき、値を変更することもできます。

ローカル変数を使用する関数

def local_scope_function():
    message = "これはローカル変数です"
    print(f"ローカル変数 message の値: {message}")
    print(f"グローバル変数 greeting の値: {greeting}")

関数 local_scope_function() ではローカル変数 message が定義されています。

ローカル変数は関数内でのみ有効であり、関数が終了すると消えてしまいます。

グローバル変数を変更する関数

def modify_global_variable():
    global greeting
    greeting = "こんにちは、世界!"
    print(f"グローバル変数 greeting が関数内で変更されました: {greeting}")

関数 modify_global_variable() では、global キーワードを使用して関数内でグローバル変数 greeting を直接変更し、その結果を表示しています。

global キーワードを使わなければ、関数内からグローバル変数を変更することはできません。

関数の実行と結果の確認

local_scope_function()
modify_global_variable()
print(f"関数外のグローバル変数 greeting の値: {greeting}")

まず local_scope_function() を実行して、ローカル変数とグローバル変数の値を確認します。

その後modify_global_variable() を実行してグローバル変数を変更し、関数の外部でその変更が反映されていることを確認します。

<<前のページ

【Python学習記事のアイキャッチ画像】Lesson3-2 関数の戻り値とデフォルト引数を理解しよう

Pythonの記事一覧

Python学習カテゴリの親ページ用アイキャッチ画像(テキスト&問題集)、記事一覧へのリンク案内

次のページ>>

【Python学習記事のアイキャッチ画像】Lesson3-4 関数の受け渡しを理解しよう

FAQ|Pythonのスコープと変数の扱い

Q
Q1. ローカル変数とグローバル変数の違いは何ですか?

ローカル変数は関数の中で定義され、その関数内でのみ有効です。一方、グローバル変数は関数外で定義され、プログラム全体でアクセス可能です。

Q
Q2. 関数内からグローバル変数を変更できますか?

globalキーワードを使うことで、関数内からグローバル変数の値を変更することができますが、プログラムの可読性や保守性に注意が必要です。

Q
Q3. スコープがバグの原因になることはありますか?

あります。意図せず同名の変数をローカルで再定義してしまった場合、元のグローバル変数にアクセスできず、想定外の挙動につながることがあります。

質問用コンタクトフォーム

この記事はAIを用いて書いた記事です。

人間の目による確認も行っていますが、もし間違い等ありましたらご指摘頂けると大変助かります。

Python記事一覧へ戻る
トップページへ戻る

記事URLをコピーしました