
【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を使い、都度オブジェクト生成 | 意図しない共有やバグを防ぐベストプラクティス |
ここでは、関数とスコープの関係やデフォルト引数の安全な使い方を学びました。