【Python入門】タプルとは?リストとの違いや使い方をわかりやすく解説!

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

Pythonでプログラミングをしていると、数や文字列といった複数のデータを一つにまとめて扱いたい場面がよくありますよね。そんな時に大活躍するのが、データをまとめて格納できる「データ構造」です。

おそらく、Pythonを学び始めた方が最初に出会うデータ構造は「リスト(list)」ではないでしょうか。角括弧 [] を使って、自由に要素を追加したり、変更したりできる、とても便利なやつです。

でも、Pythonにはリストとそっくりなのに、少しだけ性質が違う「タプル(tuple)」というものが存在することをご存知ですか?

「え、似たようなものが二つもあるの?どうして?」

「どうやって使い分ければいいの?」

そう思ったあなたは、プログラマーとして一歩成長するチャンスです!今回は、このタプルとリストの違いに焦点を当て、それぞれの特徴と上手な使い分けについて、じっくりと解説していきますね。

タプルって、そもそも何?

タプルとは、一言でいうと「複数の要素を、順序を付けて格納できるデータ型」のことです。

まずは、見た目から見ていきましょう。タプルは、リストの角括弧 [] の代わりに、丸括弧 () を使って作ります。

# これがリスト
my_list = [1, 'apple', 3.14]

# そして、これがタプルです!
my_tuple = (1, 'apple', 3.14)

print(my_list)
print(my_tuple)

特定の要素にアクセスしたいときは、リストと同じようにインデックス(順番を示す番号)を使います。

# タプルの2番目(インデックスは1)の要素を取り出す
print(my_tuple[1])
# 出力: apple

ここまでは、リストとほとんど同じように見えますよね?

では、なぜわざわざタプルというものが存在するのでしょうか。その答えは、これからお話しするたった一つの、しかし決定的な違いに隠されています。

最大の違い!「イミュータブル(変更不可)」という性質

リストとタプルの最大の違い、それは「変更できるか、できないか」という点です。

  • リストミュータブル(Mutable):作成した後でも、要素を追加、削除、変更することが可能
  • タプルイミュータブル(Immutable):一度作成したら、要素を追加、削除、変更することが不可能

なんだか難しい言葉が出てきましたね。「ミュータブル」と「イミュータブル」について、詳しく解説します!

ミュータブル (Mutable) とは「変更可能」という意味です。

例えるなら、ホワイトボードに書かれた買い物リストです。買い物の途中で「あ、醤油も買わなきゃ」と思ったら、後から書き足すことができますよね。逆に「卵はまだ家にあったな」と気づけば、消すこともできます。このように、中身を自由に変えられるのがミュータブルなリストの特徴です。

イミュータブル (Immutable) とは「変更不可能(不変)」という意味です。

こちらは、石板に刻まれた憲法をイメージしてみてください。一度「国のルールはこうです」と刻んでしまったら、後から勝手に内容を書き換えることはできませんよね。この「変えられない」という固い性質が、イミュータブルなタプルの最大の特徴なんです。

実際にコードでその違いを見てみましょう!

リストは変更できる(ミュータブル)

my_list = [10, 20, 30]
print(f'変更前: {my_list}')

# 1番目の要素を99に変更してみる
my_list[0] = 99
print(f'変更後: {my_list}')
# 出力:
# 変更前: [10, 20, 30]
# 変更後: [99, 20, 30]

このように、リストは後から中身を自由に変更できます。

タプルは変更できない(イミュータブル)

my_tuple = (10, 20, 30)
print(f'これが元のタプル: {my_tuple}')

# 1番目の要素を99に変更しようとすると…
my_tuple[0] = 99

このコードを実行すると、次のようなエラーが出てプログラムが止まってしまいます!

TypeError: 'tuple' object does not support item assignment

これは、「TypeError: 'タプル'オブジェクトは要素の代入をサポートしていません」という意味です。Pythonが「このデータは石板に刻まれているから、変更はできませんよ!」と教えてくれているんですね。

なぜ「変更できない」と嬉しいの?タプルのメリット

「変更できないなんて、不便なだけじゃないの?」と感じるかもしれません。

いいえ、そんなことはありません!この「変更できない」という性質が、実はプログラムをより安全で、効率的にしてくれる素晴らしいメリットになるんです。

1. データの安全性が高まる!

プログラムが大きくなってくると、たくさんの場所で同じデータを使い回すことがあります。もしそのデータがリスト(ミュータブル)だったら、どこか意図しない場所でうっかり中身を書き換えてしまい、それが原因でバグが発生する…なんてことが起こり得ます。

タプル(イミュータブル)を使えば、そのデータが**「絶対に変わらない」ということをプログラム上で保証**できます。これにより、予期せぬデータの変更を防ぎ、プログラム全体の安全性を高めることができるのです。

例えば、座標 (120, 80) や、色の情報 (255, 0, 0) のように、セットで一つの意味を持つデータを扱う場合にタプルは最適です。

2. 辞書の「キー」として使える!

Pythonには、キーと値をペアで保存する「辞書(dict)」という非常に便利なデータ型があります。

この辞書のキーになるためには、「ハッシュ可能(hashable)」であるという条件を満たさなければなりません。

ハッシュ可能とは、ざっくり言うと「中身が変わらないオブジェクト」のことです。もしキーの中身が変わってしまうと、辞書はどの値に対応するキーなのか分からなくなって混乱してしまいますよね。

  • タプル:イミュータブル(不変)なので、ハッシュ可能です。→ 辞書のキーになれる!
  • リスト:ミュータブル(可変)なので、ハッシュ不可能です。→ 辞書のキーになれない!
locations = {}

# タプルをキーにしてみる(成功!)
tokyo_station = (35.6812, 139.7671)
locations[tokyo_station] = '東京駅'

print(locations)
# 出力: {(35.6812, 139.7671): '東京駅'}


# リストをキーにしてみる(エラー!)
osaka_station_list = [34.7024, 135.4959]
locations[osaka_station_list] = '大阪駅'
# TypeError: unhashable type: 'list' というエラーが出る

このように、複数の値をまとめて辞書のキーにしたい場合に、タプルは必須のテクニックとなります。

3. 処理速度が少し速く、メモリ消費量も少ない

これは少し専門的な話になりますが、タプルは「変更されない」という前提があるため、Pythonの内部ではリストよりも少しだけシンプルに扱われます。その結果、リストに比べて処理速度がわずかに速く、使用するメモリも少なくなる傾向があります。

ものすごく大きな差が出るわけではありませんが、何百万もの大量のデータを扱うような場面では、このわずかな差がパフォーマンスに影響を与えることもあります。

結局、どう使い分けるの?

ここまでをまとめると、リストとタプルの使い分けは以下のようになります。

特徴リスト (list)タプル (tuple)
書き方[1, 2, 3](1, 2, 3)
変更可能性ミュータブル(変更可能)イミュータブル(変更不可)
用途要素の追加・削除・変更が頻繁にあるデータ変更したくない固定的なデータ
辞書のキー使えない使える
速度/メモリやや遅い / やや大きいやや速い / やや小さい
例えホワイトボードのメモ石板に刻まれたルール

こういう時は「リスト」を使おう!

  • ユーザーが入力したデータを次々と追加していきたい。
  • 処理の途中で要素を並べ替えたり、削除したりする必要がある。
  • とにかく、中身が変化することが前提のデータを扱う場合。

こういう時は「タプル」を使おう!

  • プログラム全体で変わることのない定数を定義したい。(例:円周率や消費税率など)
  • 関数の戻り値として、複数の値をセットで返したい。
  • 辞書のキーとして、複数の値をセットで使いたい。
  • 「このデータは絶対に変わらない」と保証したい場合。

まとめ:違いを理解して、一歩先のPythonistaへ!

今回は、Pythonのタプルとリストの違いについて、じっくりと解説しました。

一番大切なポイントをもう一度言いますね。それは、タプルはイミュータブル(変更不可)であるということです!

この「変更できない」という制約は、決して不便なものではなく、むしろプログラムをより安全で、堅牢(けんろう)にしてくれる素晴らしい特徴なのです。

これからは、データのかたまりを扱おうと思った時に、一度立ち止まってこう自問自答してみてください。

「このデータは、後から変更される可能性があるかな?それとも、ずっと固定のままかな?」

この問いに答えることで、あなたは自然とリストとタプルを正しく使い分けることができるようになっているはずです。

リストとタプルの使い分けをマスターすれば、あなたはもう初心者ではありません!

次は、同じくデータ構造の仲間である「辞書(dict)」や「集合(set)」についても学んでみると、さらにPythonで表現できることの幅がグッと広がりますよ。

あなたのプログラミングライフが、より豊かになることを心から応援しています!

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

投稿者プロフィール

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