· Fuga578 · Python基礎  · 6 min read

Pythonのリストとタプルの違い — どう使い分ければいいの?

Pythonの list と tuple、見た目はそっくりだけど中身は大違い。「変更できる/できない」だけじゃない実際の使い分け基準を、初心者向けに整理します。

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      # ❌ TypeError
Terminal
TypeError: '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 2

return で複数値を返すと、自動的にタプルになります。受け取る側は 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 (タプルとしても使える)

「不変だけど名前で参照したい」という場面で便利。最近は dataclassfrozen=True を使うことも多いです。

まとめ

  • 書き換えるならリスト, 書き換えないならタプル
  • 関数の複数戻り値は自然にタプルになる
  • 辞書のキーや集合の要素にしたいなら、タプルしかない
  • 中身を変えない意図がコードに表れるので、タプルは「読み手へのヒント」にもなる

[]() の使い分けは、慣れるとだんだん感覚で選べるようになります。最初のうちは「迷ったらリスト」でも特に問題ありません。書き換えないことが明確なら、そのときタプルに切り替える、くらいの気持ちで OK です。

Back to Blog

Related Posts

View All Posts »