【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)
動作解説
global_var
: 関数の外で定義され、プログラム全体で使用可能です。local_var
: 関数my_function
内でのみ使用可能です。
2. グローバル変数とローカル変数の使い分け
2.1 グローバル変数の注意点
グローバル変数はどこからでもアクセス可能ですが、意図しない変更を受けるリスクがあります。そのため、必要最小限に使用することが推奨されます。
# グローバル変数の変更
counter = 0 # グローバル変数
def increment():
global counter # グローバル変数を使用
counter += 1
increment()
increment()
print(f"カウンタ: {counter}")
動作解説
global counter
: グローバル変数を関数内で変更可能にします。- 関数
increment
が呼び出されるたびにcounter
が増加します。
2.2 ローカル変数を優先的に使用する
ローカル変数を使用することで、関数間の変数干渉を防ぐことができます。
# ローカル変数の使用
def increment_local():
counter = 0 # ローカル変数
counter += 1
print(f"ローカルカウンタ: {counter}")
increment_local()
increment_local()
動作解説
counter
が関数内で定義され、関数を呼び出すたびに初期化されます。- グローバル変数と異なり、関数外に影響を与えません。
3. 応用例:スコープを活用したプログラム設計
3.1 関数内関数とスコープ
関数内で別の関数を定義することができます。この場合、内側の関数は外側の関数内で定義された変数にアクセス可能です。
# 関数内関数の例
def outer_function():
outer_var = "外側の変数"
def inner_function():
print(f"内側からアクセス: {outer_var}")
inner_function()
outer_function()
動作解説
outer_var
: 外側の関数内で定義された変数。- 内側の関数
inner_function
からouter_var
にアクセスできます。
4. 練習問題
以下の課題に挑戦してみましょう。
- グローバル変数を使用せずに、関数間でデータを共有するプログラムを作成してください。
- 関数内関数を使用して、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. まとめ
スコープを正しく理解することで、バグを防ぎ、効率的なコードを記述できます。基本を押さえた上で、より高度なプログラム設計に挑戦してみてください。