未分類

【Python】第3章第5回:スコープ(ローカル変数とグローバル変数)

本記事では、Pythonにおける変数のスコープ(範囲)について詳しく解説します。スコープの基本を理解することで、コードのバグを防ぎ、効率的なプログラム設計が可能になります。

0. 記事の概要

この記事を読むメリット

  • スコープの基本を理解:変数がどこで使えるかを明確に理解できます。
  • コードのトラブルを防止:変数名の衝突や意図しない変更を防げます。
  • プログラミングスキルの向上:ローカル変数とグローバル変数を使い分けられるようになります。

この記事で学べること

  • スコープとは何か?
  • ローカル変数とグローバル変数の違い
  • グローバル変数の安全な使用方法

1. スコープの基本

1.1 スコープとは?

スコープ(Scope)とは、変数が有効な範囲を指します。Pythonでは、変数のスコープは以下の2種類に分類されます。

  • ローカルスコープ:関数内で定義された変数が適用される範囲。
  • グローバルスコープ:関数外で定義された変数が適用される範囲。
# スコープの例
global_var = "これはグローバル変数です"  # グローバルスコープ

def my_function():
    local_var = "これはローカル変数です"  # ローカルスコープ
    print(local_var)

my_function()
print(global_var)
動作解説
  1. global_var: 関数の外で定義され、プログラム全体で使用可能です。
  2. local_var: 関数my_function内でのみ使用可能です。

2. グローバル変数とローカル変数の使い分け

2.1 グローバル変数の注意点

グローバル変数はどこからでもアクセス可能ですが、意図しない変更を受けるリスクがあります。そのため、必要最小限に使用することが推奨されます。

# グローバル変数の変更
counter = 0  # グローバル変数

def increment():
    global counter  # グローバル変数を使用
    counter += 1

increment()
increment()
print(f"カウンタ: {counter}")
動作解説
  1. global counter: グローバル変数を関数内で変更可能にします。
  2. 関数incrementが呼び出されるたびにcounterが増加します。

2.2 ローカル変数を優先的に使用する

ローカル変数を使用することで、関数間の変数干渉を防ぐことができます。

# ローカル変数の使用
def increment_local():
    counter = 0  # ローカル変数
    counter += 1
    print(f"ローカルカウンタ: {counter}")

increment_local()
increment_local()
動作解説
  1. counterが関数内で定義され、関数を呼び出すたびに初期化されます。
  2. グローバル変数と異なり、関数外に影響を与えません。

3. 応用例:スコープを活用したプログラム設計

3.1 関数内関数とスコープ

関数内で別の関数を定義することができます。この場合、内側の関数は外側の関数内で定義された変数にアクセス可能です。

# 関数内関数の例
def outer_function():
    outer_var = "外側の変数"

    def inner_function():
        print(f"内側からアクセス: {outer_var}")

    inner_function()

outer_function()
動作解説
  1. outer_var: 外側の関数内で定義された変数。
  2. 内側の関数inner_functionからouter_varにアクセスできます。

4. 練習問題

以下の課題に挑戦してみましょう。

  1. グローバル変数を使用せずに、関数間でデータを共有するプログラムを作成してください。
  2. 関数内関数を使用して、2つの文字列を結合するプログラムを作成してください。

5. 練習問題の解答と解説

問1の解答例

# グローバル変数を使用しないデータ共有
def main():
    shared_data = 0

    def increment():
        nonlocal shared_data
        shared_data += 1
        return shared_data

    for _ in range(5):
        print(increment())

main()

問2の解答例

# 関数内関数で文字列を結合
def concatenate_strings(str1, str2):
    def join_strings():
        return f"{str1} {str2}"

    return join_strings()

result = concatenate_strings("こんにちは", "Python")
print(result)

6. まとめ

スコープを正しく理解することで、バグを防ぎ、効率的なコードを記述できます。基本を押さえた上で、より高度なプログラム設計に挑戦してみてください。