Pythonのリスト(list)とタプル(tuple)、どっちを使う? それぞれの違いを徹底解説
Pythonを学び始めると、避けては通れないのがデータのまとめ方です。 特にリストとタプルは見た目が似ているため、どちらを使えばいいのか迷ってしまいますよね。
私もエンジニアになりたての頃は、とりあえず全部リストでいいやと考えていました。 しかし、現場でコードを書くようになると、この2つの使い分けが非常に重要であることに気づかされます。
今回はプロの視点から、初心者の方でも納得できるように違いを噛み砕いてお話しします。 この記事を読み終える頃には、自信を持って使い分けができるようになっているはずです。
なぜ2つの似たような仕組みがあるのか¶
まずは、多くの人が抱く素朴な疑問から解決していきましょう。 なぜPythonには、わざわざ似たようなデータ構造が2つも用意されているのでしょうか。
答えを一言でいうなら、データの安全性を守るため、そしてプログラムの動作を速くするためです。 一見すると不便に思える制限も、実は大きなメリットを秘めています。
自由なリストと頑固なタプル¶
リストは、中身を自由に入れ替えたり追加したりできる柔軟な箱のような存在です。 それに対してタプルは、一度中身を決めたら二度と変えることができない頑丈な金庫です。
この自由度の違いが、プログラミングにおける役割の違いを生み出しています。 まずはそれぞれの特徴を整理した比較表を見て、全体像を掴んでみましょう。
| 特徴 | リスト (list) | タプル (tuple) |
|---|---|---|
| 書き方 | [1, 2, 3] (角カッコ) |
(1, 2, 3) (丸カッコ) |
| 変更の可否 | できる(可変 / Mutable) | できない(不変 / Immutable) |
| 処理速度 | 普通 | リストより速い |
| メモリ消費 | 多い | 少ない |
| 主な用途 | データの追加や削除がある時 | データを固定して保護したい時 |
リスト(list)の特徴:変化を受け入れる柔軟性¶
リストの最大の特徴は、プログラムの実行中に中身を書き換えられることです。 これを専門用語でミュータブル(可変)と呼びます。
例えば、買い物リストやToDoアプリのタスク管理をイメージしてください。 新しい項目を追加したり、終わったものを消したりする操作が必要ですよね。
リストの基本的な使い方¶
Pythonでリストを書くときは、全体を[]で囲みます。
実際に、リストの中身を書き換える例をコードで見てみましょう。
# リストの作成
shopping_list = ["りんご", "バナナ", "オレンジ"]
# 中身を書き換える
shopping_list[0] = "いちご"
# 新しい要素を追加する
shopping_list.append("メロン")
print(shopping_list)
# 出力: ['いちご', 'バナナ', 'オレンジ', 'メロン']
このように、リストは後からいくらでも中身を加工することができます。 非常に便利な反面、どこで誰が書き換えたかわからなくなるというリスクも抱えています。
10年選手が語るリストの使い所¶
私が実務でリストを使うのは、データの個数が決まっていないときです。 データベースから何件返ってくるかわからない検索結果などは、必ずリストで受け取ります。
また、ループ処理(for文)の中でデータを加工して溜めていく場合もリストの独壇場です。 迷ったらリスト、という考え方も間違いではありませんが、乱用には注意が必要です。
タプル(tuple)の特徴:変わらないことの安心感¶
一方で、タプルは一度作成すると中身を変更することができません。 これをイミュータブル(不変)と呼び、タプルのアイデンティティとなっています。
書き方は、全体を()で囲むだけなのでリストと非常に似ています。
しかし、中身を書き換えようとするとPythonから怒られてしまいます。
タプルの挙動を確認する¶
あえてエラーが出る操作をしてみることで、タプルの頑固さを確認してみましょう。 以下のコードを実行すると、プログラムは途中で止まってしまいます。
# タプルの作成
coordinates = (35.6895, 139.6917)
# 中身を書き換えようとする(エラーになります)
# coordinates[0] = 36.0
print(coordinates)
なぜ、わざわざ不自由な思いをしてまでタプルを使うのでしょうか。 それは、絶対に変わってほしくない情報を守るためです。
例えば、東京の緯度と経度がプログラムの途中で勝手に書き換わったら困りますよね。 タプルを使うことで、書き換えによるバグを未然に防ぐことができるのです。
【関連記事】 Pythonの例外処理のアンチパターン5選をご紹介!
リストとタプルの決定的な3つの違い¶
表面上の書き方以外に、この2つには大きな違いが3つあります。 これを知っていると、エンジニアとしてのレベルが一段上がります。
1. 処理速度とパフォーマンス¶
実は、タプルの方がリストよりも動作がわずかに高速です。 これは、タプルが中身を変えない前提でメモリを効率的に使うからです。
数件のデータなら差は感じませんが、数百万件のデータを扱う場合は話が変わります。 データの参照スピードを追求するなら、タプルを選ぶのが賢い選択と言えるでしょう。
2. メモリの節約¶
タプルは、リストよりもメモリ消費量が少ないという特徴があります。 リストは将来の追加に備えて余分な領域を確保しますが、タプルはジャストサイズで保存します。
限られたリソースで動かすシステムでは、この小さな差が安定性に繋がります。 10年前のPCならまだしも、現代では気にしすぎる必要はありませんが、知識として持っておきましょう。
3. 辞書のキーになれるかどうか¶
Pythonの辞書(dict)という仕組みでは、キーとして使えるものに制限があります。 変更可能なリストはキーになれませんが、変更不可能なタプルはキーになれます。
# タプルを辞書のキーにする例
location_data = {
(35.6, 139.6): "東京",
(34.6, 135.5): "大阪"
}
このように、複数の値をセットにして名前を付けたい場合にタプルは非常に重宝します。 座標や日付など、セットで意味を成すデータにはタプルが最適です。
実践的な使い分けの判断基準¶
理屈はわかったけれど、結局どっちを使えばいいの?と迷うこともあるはずです。 そんな時のために、私が現場で使っている判断基準を共有します。
リストを選ぶべきシーン¶
基本的には、情報の増減や入れ替えが発生するならリスト一択です。 ユーザー一覧や、チャットのメッセージ履歴などがこれに当たります。
また、同じ種類のデータを並べて、一つずつ処理したい時もリストが向いています。 データの順序が重要で、かつ中身が動的に変わるならリストを選びましょう。
タプルを選ぶべきシーン¶
逆に、データの意味が決まっていて、順序に特別な意味がある場合はタプルです。 例えば、RGBのカラーコード「(255, 255, 255)」などはタプルが似合います。
また、関数の戻り値として複数の値を返したい時もタプルの出番です。 「成功したかどうか」と「取得したデータ」をセットで返すような場面ですね。
def get_user_status(user_id):
# (ステータス, メッセージ) をタプルで返す
return (200, "Success")
status, msg = get_user_status(1)
このように「アンパック代入」と呼ばれる便利な書き方ができるのもタプルの強みです。 一度設定したらアプリ終了まで変えない設定値なども、タプルに閉じ込めておくと安心です。
【関連記事】 Pythonの型ヒントとは?基礎から応用まで解説
エンジニア10年の経験から伝えたいこと¶
ここからは少し踏み込んだ、現場ならではのお話をさせてください。 私がこれまで見てきたバグの多くは、リストを不適切に使い回したことが原因でした。
どこか遠くの関数でリストの中身が書き換わっており、原因究明に数日かかることもあります。 そんなとき「ここがタプルだったら、エラーですぐ気づけたのに」と何度も思いました。
イミュータブル(不変)の重要性¶
最近のプログラミングでは、なるべくデータを変えないという考え方が主流です。 不変なデータは、並列処理や複雑なロジックの中でも挙動が予測しやすいからです。
最初はリストの方が使い勝手が良く感じるかもしれませんが、タプルを意識的に使ってみてください。 書き換えを制限することが、結果としてバグの少ない綺麗なコードに繋がります。
開発チームでのコミュニケーション¶
また、タプルを使うことは他の開発者へのメッセージにもなります。 「このデータは絶対に変えないでね」という意図を、コードだけで伝えることができるのです。
コメントで「書き換え禁止」と書くよりも、タプルで定義する方が100倍強力です。 プログラミングは機械との対話であると同時に、人間同士の対話でもあることを忘れないでください。
まとめ¶
最後に、今回お伝えした内容を振り返ってみましょう。 リストとタプル、それぞれの個性を理解することが大切です。
リストは自由で多機能な、成長し続けるノートのような存在です。 タプルは正確で信頼できる、歴史を刻んだ石碑のような存在だと言えます。
まずは「変更が必要ならリスト」「変更が不要ならタプル」という基本から始めてみてください。 その小さなこだわりが、あなたの書くコードをよりプロフェッショナルなものに変えていきます。
Pythonの学習はまだまだ続きますが、一歩ずつ確実に進んでいきましょう。 この記事が、あなたのプログラミングライフを少しでも明るく照らすことができれば幸いです。