【実は知らない】Pythonのlistとtupleの意外な違い10選
Pythonを使っていると、list
と tuple
を見かけることがよくありますよね。
「リストは変更できて、タプルはできない」くらいは知っていても、
実はそれ以外にもたくさん違いがあるんです。
この記事では、初心者の方にもわかりやすく
list
と tuple
の「意外と知られてない違い」を10個にまとめました!
🔰 まずはざっくり違いをおさらい
項目 | list ([] ) |
tuple (() ) |
---|---|---|
変更可能か | ✅ 変更できる | ❌ 変更できない(イミュータブル) |
記述方法 | [1, 2, 3] |
(1, 2, 3) |
主な用途 | データの追加・更新がある場面 | 固定データ、辞書のキーなど |
🧠 違い1:変更可能かどうか
lst = [1, 2, 3]
lst[0] = 10 # OK!
tup = (1, 2, 3)
tup[0] = 10 # ❌ TypeError
タプルは一度作ったら 中身を変更できません。
この違いが一番有名ですね。
🧠 違い2:処理速度がちがう(タプルの方が速い)
import timeit
print(timeit.timeit("[1, 2, 3, 4, 5]", number=1000000))
print(timeit.timeit("(1, 2, 3, 4, 5)", number=1000000))
タプルの方が ちょっとだけ速い。
理由は「変更不可なので最適化されやすい」から。
🧠 違い3:辞書のキーに使えるかどうか
d = {}
d[[1, 2]] = 'list' # ❌ TypeError: unhashable type: 'list'
d[(1, 2)] = 'tuple' # ✅ OK
リストは 辞書のキーにできません。
タプルは ハッシュ可能(不変)なので使えます。
🧠 違い4:括弧を省略できるのはタプルだけ
x = 1, 2, 3
print(type(x)) # <class 'tuple'>
()がなくても、カンマがあればタプル
。これ初心者あるあるな罠!
🧠 違い5:1要素タプルはカンマ必須
t = (1) # int型になる
t = (1,) # tuple型になる!
カッコだけではダメで、カンマがないとタプルにならない。
🧠 違い6:リストはコピーしても同じ場所を指すことがある
a = [1, 2, 3]
b = a
b[0] = 100
print(a) # [100, 2, 3] ←変わっちゃう!
# タプルはそもそも変更できないから安心
「参照渡し」に注意。コピーの仕方に気をつけましょう。
🧠 違い7:メモリ使用量がタプルの方が少ない
import sys
print(sys.getsizeof([1, 2, 3])) # 88
print(sys.getsizeof((1, 2, 3))) # 72
変更できないぶん、タプルは軽量。
大量のデータを扱うときは差が出ます。
🧠 違い8:多重代入に向いてるのはタプル
x, y = (10, 20) # ✅ OK
x, y = [10, 20] # これもOKだが、タプルの方が自然
一時的な複数データの受け渡しは タプルがしっくりきます。
🧠 違い9:関数の戻り値でよく使われるのはタプル
def get_user():
return "name", 20 # これは tuple を返してる
name, age = get_user()
return
で複数の値を返すときは、タプルが暗黙的に使われます。
🧠 違い10:「リストの中のタプル」「タプルの中のリスト」使い分けのヒント
list_of_tuples = [(1, 2), (3, 4)] # ✅
tuple_of_lists = ([1, 2], [3, 4]) # ⚠️ 中身は変更できる
「全体の構造を変えないけど、中身だけ変える」
そんなときにこの使い分けが便利です。
📌 おわりに
「listとtupleの違い」は、知ってるようで意外と知らない落とし穴が多いです。
特に初心者のうちは「なんとなく使ってる」ことも多いですが、
この違いを理解しておくと、コードの バグ防止 や パフォーマンス改善 にもつながります!
ご感想・コメントなど大歓迎です!
他にも「Pythonのこれ気になる!」があれば教えてください 😄