【6日でできるPython入門】関数③

 Pythonの関数はシンプルな使い方から高度な応用まで、多くの機能を備えています。ここでは関数の「スコープ(変数の有効範囲)」と「デフォルト引数とミュータブル型の注意点」を中心に、より深い関数の仕組みを解説します。
 スコープの知識はバグ防止
安全なプログラム設計に必須です。また、ミュータブルなオブジェクトをデフォルト引数に使う場合の落とし穴は、Python初学者がよく悩むポイントです。ここで「なぜそうなるのか」「どう防ぐか」をしっかり身につけましょう。

1.変数のスコープ(有効範囲)

1.1. グローバル変数とローカル変数

ファイル名: lesson19-1.py

message = "おはようございます"  # グローバル変数

def greet():
    print(message)  # 関数内からグローバル変数を参照

greet()
print(message)

実行結果

おはようございます
おはようございます

解説

  • グローバル変数は、関数の外からも中からも参照できます。

1.2. ローカル変数とスコープのエラー

ファイル名: lesson19-2.py

def introduce():
    name = "山田"  # ローカル変数
    print(f"私は{name}です。")

introduce()
# print(name)  # ← これはエラーになる(コメントを外すと確認できます)

実行結果

私は山田です。

(もしprint(name)を外すと…)

NameError: name 'name' is not defined

解説

  • ローカル変数は関数内だけで有効です。外からは見えません。

1.3. ローカルとグローバルの同名変数

ファイル名: lesson19-3.py

city = "東京"  # グローバル変数

def show_city():
    city = "大阪"  # ローカル変数(同じ名前でもこっちが優先)
    print(f"今いる都市は{city}です。")

show_city()
print(f"グローバルな都市名:{city}")

実行結果

今いる都市は大阪です。
グローバルな都市名:東京

解説

  • 関数内で同名の変数を定義すると、ローカル変数が優先されます。

1.4. global文によるグローバル変数の書き換え

ファイル名: lesson19-4.py

counter = 0

def count_up():
    global counter  # グローバル変数を明示的に使う
    counter += 1
    print(f"カウンター:{counter}")

count_up()
count_up()
print(f"最終カウンター:{counter}")

実行結果

カウンター:1
カウンター:2
最終カウンター:2

解説

  • global文を使うと、関数内からグローバル変数を変更できます。
  • ただし、グローバル変数の多用は可読性やバグの元になるので注意。

2.ミュータブルなデフォルト引数の注意点

2.1. ミュータブル型のデフォルト値の落とし穴

ファイル名: lesson19-5.py

def add_pet(pet_list=[]):
    pet_list.append("ねこ")
    return pet_list

first = add_pet()
print("1回目:", first)
second = add_pet()
print("2回目:", second)

実行結果

1回目: ['ねこ']
2回目: ['ねこ', 'ねこ']

解説

  • リスト(ミュータブル型)をデフォルト引数に使うと、値が関数呼び出し間で共有されるため、意図しない挙動になります。

2.2. 安全なデフォルト値の使い方

ファイル名: lesson19-6.py

def add_pet_safely(pet_list=None):
    if pet_list is None:  # Noneを使って新しくリストを作成
        pet_list = []
    pet_list.append("いぬ")
    return pet_list

a = add_pet_safely()
print("安全な1回目:", a)
b = add_pet_safely()
print("安全な2回目:", b)

実行結果

安全な1回目: ['いぬ']
安全な2回目: ['いぬ']

解説

  • デフォルト値にNoneを使い、関数内で必要に応じて初期化することでバグを防げます。

3.スコープとデフォルト引数のまとめ表

用語概要ポイント
グローバル変数関数の外で定義、どこからでも参照可書き換えにはglobal文が必要
ローカル変数関数の内だけで有効外からは見えない
global文関数内でグローバル変数を書き換える多用は推奨されない
ミュータブル型リストや辞書など、値の変更が可能デフォルト値に使うときは要注意
Noneによる初期化Noneを使い、都度オブジェクト生成意図しない共有やバグを防ぐベストプラクティス

ここでは、関数とスコープの関係デフォルト引数の安全な使い方を学びました。