イミュータブル型とタプル

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

イミュータブル型とタプル とは

イミュータブル型とミュータブル型の違い、タプルの使い方を学びます。本レッスンでは、イミュータブル型とタプル の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

ミュータブルとイミュータブル

Python の値は、作った後で内容を書き換えられるかどうか で 2 種類に分かれます。書き換えできるものを ミュータブル (mutable, 可変)、書き換えできないものを イミュータブル (immutable, 不変) と呼びます。

  • イミュータブル 型 — int float str bool tuple frozenset None
  • ミュータブル 型 — list dict set

たとえば 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) に貼り直されただけで、最初のタプル自身は不変です。

diagram (will load when visible)

よくある間違い

タプルとイミュータブルでつまずきやすいポイントを 3 つ紹介します。

  1. 要素 1 個のタプルでカンマを忘れる (42)int42 です。タプルにしたいなら (42,) と末尾カンマを付けます。
  2. タプルの要素を直接書き換える data[0] = 99TypeError です。書き換えたいならリストに変換するか、新しいタプルを作り直します。
  3. ミュータブルな要素を入れて油断する (1, [2, 3]) のようにタプルの中にリストを入れると、リスト自体は書き換え可能なので注意が必要です。タプル全体がイミュータブルになるわけではありません。

イミュータブル型は ハッシュ可能 (hashable) なので、set の要素や dict のキーとして使えます。hash((1, 2)) は計算できますが、hash([1, 2]) はエラーです。

やってみよう

整数 ab を受け取り、タプル (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 つができることを確認しましょう。

  1. イミュータブル の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. イミュータブル とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. 途中でタプル (a, b) を作る
  2. list 関数でタプルをリストに変換する
  3. 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]

ヒント

main.py
main.py
学習モード

メモ

イミュータブル型とタプル

⌘S で保存