· Fuga578 · Python基礎 · 6 min read
Pythonのリストとタプルの違い — どう使い分ければいいの?
Pythonの list と tuple、見た目はそっくりだけど中身は大違い。「変更できる/できない」だけじゃない実際の使い分け基準を、初心者向けに整理します。

Python の入門書を読むと、必ずと言っていいほど出てくるのが「リストとタプル」のペア。見た目は [] と () の違いだけ、なのに「使い分けが大事」と言われる。
この記事では、その「使い分け」を、現実のコードで何が嬉しいのか / 何が困るのかという観点で整理します。
見た目の違い
my_list = [1, 2, 3] # リスト: []
my_tuple = (1, 2, 3) # タプル: ()カッコの種類が違うだけ。要素にアクセスする書き方も同じです。
print(my_list[0]) # 1
print(my_tuple[0]) # 1一番大事な違い: 「変更できる」か「できないか」
リストは中身を書き換えられる、タプルは書き換えられない。これが本質です。
my_list = [1, 2, 3]
my_list[0] = 999 # ✅ OK
my_list.append(4) # ✅ OK
print(my_list) # [999, 2, 3, 4]my_tuple = (1, 2, 3)
my_tuple[0] = 999 # ❌ TypeErrorTypeError: 'tuple' object does not support item assignment
タプルは作った後は中身を変えられません。「変えてはいけないデータの集まり」を表現するための型です。
じゃあ、いつどっちを使う?
ここが一番大事。よくある「ルール」を3つ挙げます。
ルール1: 中身を書き換えるならリスト
「これからアイテムを追加・削除・並べ替えする」予定があるなら、迷わずリスト。
# 入力された数字を集めて、後でソートしたい
numbers = []
for _ in range(5):
numbers.append(int(input()))
numbers.sort()
print(numbers)リストには append, remove, sort, reverse など、変更系のメソッドが豊富にあります。
ルール2: 「中身を変えない意図」を伝えたいときはタプル
例: 関数から複数の値を返すとき。
def divmod_simple(a, b):
return a // b, a % b # タプルで返す
quotient, remainder = divmod_simple(17, 5)
print(quotient, remainder) # 3 2return で複数値を返すと、自動的にタプルになります。受け取る側は q, r = ... のように分解 (アンパック) できる。これは Python の超頻出パターン。
ルール3: 辞書のキーや集合の要素にしたいときは「タプル必須」
dict のキーや set の要素には、変更できないもの (immutable) しか使えません。リストはダメ、タプルはOK。
positions = {}
positions[(0, 0)] = "プレイヤー" # ✅ タプルはキーにできる
positions[(3, 5)] = "敵"
# positions[[0, 0]] = "..." # ❌ TypeError: unhashable type: 'list'座標 (x, y) のような「セットで意味を持つ複数値」は、まさにタプル向き。
速度・メモリの違い (おまけ)
タプルはリストより軽くて速いです。違いは小さいですが、巨大データを大量に扱うときには効いてきます。
| 項目 | リスト | タプル |
|---|---|---|
| 書き換え | できる | できない |
| メモリ | やや多い | やや少ない |
| 生成速度 | やや遅い | やや速い |
| 用途 | 動的な集まり | 固定された組み合わせ |
名前付きタプルの紹介 (中級者向け)
タプルの弱点は「my_tuple[0] のように位置で参照するので、何の値か分かりにくい」こと。これを解決するのが namedtuple。
from collections import namedtuple
Point = namedtuple("Point", ["x", "y"])
p = Point(3, 5)
print(p.x, p.y) # 3 5
print(p[0], p[1]) # 3 5 (タプルとしても使える)「不変だけど名前で参照したい」という場面で便利。最近は dataclass の frozen=True を使うことも多いです。
まとめ
- 書き換えるならリスト, 書き換えないならタプル
- 関数の複数戻り値は自然にタプルになる
- 辞書のキーや集合の要素にしたいなら、タプルしかない
- 中身を変えない意図がコードに表れるので、タプルは「読み手へのヒント」にもなる
[] と () の使い分けは、慣れるとだんだん感覚で選べるようになります。最初のうちは「迷ったらリスト」でも特に問題ありません。書き換えないことが明確なら、そのときタプルに切り替える、くらいの気持ちで OK です。

