はじめに
Python を使いこなす上で欠かせない “関数(function)” と “スコープ(scope)”。
この2つをしっかり理解すると、あなたのコードは劇的に読みやすく・壊れにくく・バグりにくくなる。
今日はそれを やさしく、でも本質的に 解説していきます。
1. 関数とは?
Python の関数は、ざっくり言えば 「処理をまとめたミニロボット」。
必要な仕事をお願いすると動き、終わったら結果を返してくれます。
def greet(name):
return f"Hello, {name}!"
呼び出しは簡単。
greet("Anna") # → Hello, Anna!
関数を使うメリット
- 再利用しやすい
- コードの見通しが良くなる
- 大規模開発でも管理しやすくなる
- テストしやすい
- バグが局所化される
関数は “綺麗なコードの第一歩” といえる存在です。
2. スコープ(作用域)とは?
スコープとは 変数がどこから見えるか(参照できるか) のこと。
Python のスコープは大きく分けて2つ。
2.1 ローカルスコープ(関数の中)
関数の中で作られた変数は、その関数の中でしか使えません。
def f():
x = 10
print(x) # OK!
f()
print(x) # ❌ NameError: x is not defined
外から見ると完全に “見えない”。
2.2 グローバルスコープ(ファイル全体)
関数の外で定義した変数は、関数の中から参照できます。
x = 10
def f():
print(x) # OK
f()
ただし、書き換える時は注意が必要です。(後述)
3. global と nonlocal
Python を深く使えるようになる大きな踏み台。
3.1 global:外の変数を“書き換える”
関数内でグローバル変数を変更したいなら global が必要です。
x = 10
def f():
global x
x = 20
f()
print(x) # → 20
3.2 nonlocal:一段外側の関数変数を書き換える
ネスト関数でよく使われる。
def outer():
x = 10
def inner():
nonlocal x
x = 30
inner()
print(x) # → 30
outer()
4. Python の「引数は参照の値渡し(Call by Object Reference / Call by Sharing)」
Python の変数は 値を持つのではなく “参照” を持つ。
これが最強のポイント。
4.1 ミュータブル(可変)型
list / dict / set は「中身が変わる」。
渡して書き換えると、元の変数も変わります。
def add_item(lst):
lst.append(1)
a = []
add_item(a)
print(a) # → [1]
これは「参照渡し」だからではなく
「同じオブジェクトを共有している」から。
—> Call by Sharing の典型例
4.2 イミュータブル(不可変)型
int / str / tuple は中身が変わらない。
def inc(x):
x += 1
n = 10
inc(n)
print(n) # → 10
5. Python のスコープは「ブロックスコープじゃない」
Python は C や Java のように {} ブロックごとにスコープを作らない。
if True:
x = 10
print(x) # 10 ← 外で使えてしまう!
for や while も同じ。
for i in range(3):
pass
print(i) # 2 ← 生きてる
Python のスコープは関数単位(Function scope)
ここだけは絶対に覚えておくと強い。
6. Python の罠:デフォルト引数の“永遠に残るリスト”
この話、Python 初心者も中級者も例外なく一度はハマる。
def f(x=[]):
x.append(1)
return x
print(f()) # [1]
print(f()) # [1, 1]
print(f()) # [1, 1, 1]
なぜ?
答えはこれ:
Python のデフォルト引数は「関数が定義された瞬間に一度だけ評価される」
呼ぶたびに新しいリストが作られるのではなく、
同じリストがずっと使われる。
正しい書き方(Python の黄金定石)
def f(x=None):
if x is None:
x = []
x.append(1)
return x
まとめ
| 内容 | 一言で説明 |
|---|---|
| 関数とは? | 小さなロボット。仕事して結果を返す |
| スコープ | 変数の見える範囲 |
| ローカル | 関数内だけ見える |
| グローバル | 外で定義したものは関数から参照可能 |
| global | グローバル変数を書き換える宣言 |
| nonlocal | ネスト関数の一段上を操作 |
| 引数 | 参照を渡す |
| デフォルト引数 | 一度だけ評価され“永遠に残る” |