【Python】レッスン3-03:スコープの概念を理解しよう

記事内に商品プロモーションを含む場合があります

この記事で学べる知識:スコープの概念

この記事の練習問題で使用する知識:
レッスン1の知識、比較演算子と論理演算子条件分岐(if-else文)条件分岐(elif文)条件分岐(match文)繰り返し処理(for文)繰り返し処理(while文)繰り返しの制御、エラーメッセージ例外処理の基礎関数の定義と使用戻り値とデフォルト引数スコープの概念関数の受け渡し無名関数

<<前の問題 問題集Top 次の問題>>

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

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




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

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

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

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

この問題の要件

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

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

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

*****↓↓正解コードの実行結果の例↓↓*****

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

この問題を解くヒント

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

ヒント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 の変更後の値を関数外で表示

ヒント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}")  # 変更後のグローバル変数の値が表示される

 

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



解答例と解説

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

正解コードの例

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

# グローバルスコープで変数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におけるスコープの概念(変数の有効範囲)を理解するための例を示しています。

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

グローバル変数の定義

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() を実行してグローバル変数を変更し、関数の外部でその変更が反映されていることを確認します。

<<前の問題 問題集Top 次の問題>>

この記事への質問・コメント

この記事を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






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