0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python】Python 関数とスコープを徹底理解する

Last updated at Posted at 2025-11-16

はじめに

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  ← 外で使えてしまう!

forwhile も同じ。

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 ネスト関数の一段上を操作
引数 参照を渡す
デフォルト引数 一度だけ評価され“永遠に残る”

0
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?