Pythonのタプルはなぜイミュータブルなのか?その理由と意味をやさしく解説

こんにちは。ゆうせいです。

今回は「タプル(tuple)はなぜイミュータブル(immutable)なのか?」というテーマで、Pythonの基本構造のひとつを深掘りしていきましょう。

「イミュータブルってなに?」という人も、「リストとの違いがよくわからない…」という人も、安心してください。わかりやすく、かみくだいて説明します!


タプルとは?リストとの違いを整理しよう

まずは、タプル(tuple)そのものが何なのかを押さえておきましょう。

タプルの例

my_tuple = (1, 2, 3)

一方、リスト(list)はこんな感じ。

my_list = [1, 2, 3]

見た目はほとんど同じですが、使っているカッコが違いますね。

  • タプル → 丸カッコ: ()
  • リスト → 角カッコ: []

違いを表で比較!

特徴タプル (tuple)リスト (list)
変更可能かいいえ(イミュータブル)はい(ミュータブル)
速度やや速いやや遅い
用途固定されたデータ可変なデータ
書き換えできないできる

「イミュータブル」とはどういうこと?

ここで出てきたイミュータブル(immutable)という言葉。これはプログラミングにおいてよく使われる用語です。

意味をかんたんに言うと…

「中身をあとから変更できない」こと

たとえば、タプルを作ったあとで中の値を変えようとするとエラーになります。

my_tuple = (1, 2, 3)
my_tuple[0] = 99  # ← エラーになる!


なぜタプルはイミュータブルなのか?

いよいよ本題に入っていきましょう。「なぜ」変更できないようになっているのか。

理由は大きく分けて 3つ あります。

① 安全性と信頼性のため

イミュータブルなデータは、うっかり変更されないというメリットがあります。

たとえば関数にデータを渡すとき、「呼び出し元のデータが変わってしまう」とバグの原因になります。でも、イミュータブルなら安心ですね。

② ハッシュ化できるから

これはちょっと専門的ですが重要な話。

Pythonでは、辞書(dict)のキーにタプルは使えますが、リストは使えません。

my_dict = {(1, 2): "hello"}  # OK!
my_dict = {[1, 2]: "hello"}  # エラー!

これは「ハッシュ化(hashing)」が関係しています。

ハッシュとは?

データに「一意な番号(ハッシュ値)」をつけて、素早くアクセスできるようにする技術

ハッシュ化には「変わらない(イミュータブル)こと」が必要なんです。

変更できるリストはハッシュ値が不安定なので、キーにできません。

③ 処理が速くなるから

タプルは「一度作ったらもう変わらない」という前提があるので、Pythonの内部ではリストよりも効率よく扱えることがあります。

とくに、関数の引数としてよく使われる場面では、そのスピードと軽さが大きな武器になります。


例え話:イミュータブル vs ミュータブル

ちょっとイメージしやすくするために、例え話をしましょう。

  • タプルは「石に刻まれた文字
  • リストは「ホワイトボードに書いた文字

石に刻んだ文字は後から変えられません。でもそのぶん、いつ見ても同じで信頼できます。

ホワイトボードは何度でも書き直せますが、うっかり消してしまうリスクもある。

タプルとリストの違いも、まさにそんなイメージです!


まとめ:タプルがイミュータブルな理由

  • 変更できないことで、安全性信頼性が高まる
  • ハッシュ可能なので、辞書のキーなどに使える
  • 処理が高速になる

今後の学習のヒント

タプルの特徴がわかったら、次はこんなテーマにも挑戦してみましょう。

  • namedtupledataclassでの応用的な使い方
  • タプルのネスト(タプルの中にタプル)
  • リストとタプルの使い分けの実例
  • イミュータブルな他の型(str, frozensetなど)

いろいろ試して、「なぜこういう設計になっているのか?」を考えるクセをつけると、Pythonの理解がどんどん深まりますよ。

それでは、次回もお楽しみに!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。