イミュータブル型とタプル
イミュータブル型とタプル とは
イミュータブル型とミュータブル型の違い、タプルの使い方を学びます。本レッスンでは、イミュータブル型とタプル の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
ミュータブルとイミュータブル
Python の値は、作った後で内容を書き換えられるかどうか で 2 種類に分かれます。書き換えできるものを ミュータブル (mutable, 可変)、書き換えできないものを イミュータブル (immutable, 不変) と呼びます。
イミュータブル型 —intfloatstrbooltuplefrozensetNoneミュータブル型 —listdictset
たとえば str はイミュータブルなので、name[0] = 'A' のように一部だけを書き換えることはできません。一方 list はミュータブルなので、numbers[0] = 99 で要素を書き換えられます。
Python
text = 'hello'
text[0] = 'H' # TypeError
numbers = [1, 2, 3]
numbers[0] = 99 # OK -> [99, 2, 3]イミュータブル型は 値そのもの を別の値として扱う、ミュータブル型は 同じ箱の中身 を入れ替える、というイメージです。
タプルとリストの違い
tuple (タプル) は、見た目はリストに似ていますが イミュータブル な点が違います。タプルは () または , で作ります。
Python
pair = (1, 2)
triple = ('Ada', 36, True)
single = (42,) # 要素 1 個のタプルは末尾にカンマが必要
empty = ()作った後で要素を変えられず、要素を追加・削除することもできません。これは「変更されない」ことが保証されているという意味で、安全に共有できる という利点があります。
()1 個だけだとただの括弧として扱われるので、要素 1 個のタプルは(42,)のように カンマを必ず付ける ことが必要です。
タプルが活躍する場面
- 関数から複数の値を返す
return name, ageのように書くと、Python は内部でタプルにまとめて返します。 - 辞書のキーに使う
dictのキーはイミュータブルでないといけないので、リストはキーにできませんがタプルは OK です。 - 定数を表す
WEEKDAYS = ('Mon', 'Tue', 'Wed', ...)のように、変えてはいけない値を入れる入れ物にぴったりです。
Python
def divide(a, b):
return a // b, a % b
q, r = divide(10, 3)
# q=3, r=1動きを追ってみる
タプルに対して書き換えを試みると、はっきりとエラーになります。
Python
data = (1, 2, 3)
data[0] = 99 # TypeError: 'tuple' object does not support item assignmentこのエラーは、tuple がイミュータブルであることを Python が守ってくれている証拠です。一方、タプル自体を別の値に 再代入 することは可能です。
Python
data = (1, 2, 3)
data = (99, 2, 3) # OK 変数 data に新しいタプルを結びつけ直しただけ変数 data は今まで (1, 2, 3) を指していましたが、= で別のタプル (99, 2, 3) に貼り直されただけで、最初のタプル自身は不変です。
よくある間違い
タプルとイミュータブルでつまずきやすいポイントを 3 つ紹介します。
- 要素 1 個のタプルでカンマを忘れる
(42)はintの42です。タプルにしたいなら(42,)と末尾カンマを付けます。 - タプルの要素を直接書き換える
data[0] = 99はTypeErrorです。書き換えたいならリストに変換するか、新しいタプルを作り直します。 - ミュータブルな要素を入れて油断する
(1, [2, 3])のようにタプルの中にリストを入れると、リスト自体は書き換え可能なので注意が必要です。タプル全体がイミュータブルになるわけではありません。
イミュータブル型は ハッシュ可能 (hashable) なので、
setの要素やdictのキーとして使えます。hash((1, 2))は計算できますが、hash([1, 2])はエラーです。
やってみよう
整数 a と b を受け取り、タプル (a, b) を作り、それを リストに変換して 返す関数 make_pair を実装してください。途中でタプルを経由するのがポイントです。pair = (a, b) を作ってから return list(pair) を呼びましょう。タプルは関数内部で複数の値をまとめるのに便利な、イミュータブルなコンテナです。最後にリストに変換するのは、テストの都合で JSON 配列と比較するためです。
よくある質問
Q. このトピックは Python 以外の言語でも同じ書き方ですか?
A. 考え方は他言語と共通ですが、構文や標準ライブラリは異なります。Python はインデントでブロックを表し、コロン + 改行で構造を作るのが特徴です。他言語に移行する際は基本概念を維持しつつ、構文の差分を意識して書き換えると混乱が少ないです。
Q. 実行してエラーが出た場合の対処は?
A. エラーメッセージの最後の行(TypeError や NameError などの型)から原因と該当行を確認します。Python はトレースバックが下から上に読むと「呼び出し元 → 内部」の順で辿れます。print や IDE のデバッガで途中の変数を確認すると原因が見えてきます。
Q. 次のステップで何を学ぶべきですか?
A. 本レッスンの内容を理解できたら、本文の「やってみよう」を実装し、章末クイズに進むのがおすすめです。さらに自分のミニアプリ(電卓・todo・スコア集計など)に応用するとスキルが定着します。詰まったら本文の H2 セクションに戻って読み返してください。
次のレッスン
次は 第2章クイズ — 型と変数 で、イミュータブル型とミュータブル型の違い、タプルの使い方を学びます を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- イミュータブル の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. イミュータブル とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- 途中でタプル (a, b) を作る
- list 関数でタプルをリストに変換する
- return 文で結果を返す
入出力例
test-cases.txt
make_pair(1, 2) → [1,2]
make_pair(0, 0) → [0,0]
make_pair(-3, 7) → [-3,7]
make_pair(100, 200) → [100,200]