タプルの要素を書き換えようとした原因と直し方
タプルの要素を書き換えようとしたときに出るエラーです。丸括弧のタプルと角括弧のリストは見た目が似ていますが、変更可能かどうかが根本的に違います。
エラーメッセージの読み方
Traceback (most recent call last):
main.py- ファイル名
2- 行番号 — 実際にクラッシュした行
<module>- 発生場所 — <module> ならトップレベル、関数名ならその関数の中
TypeError- 例外クラス — 何が起きたか。ここを検索するのが最短です
'tuple' object does not support item assignment- 詳細メッセージ — どの値が問題だったか
このエラーが出る典型パターン
パターン1
1 point = (1, 2) ^ 2 point[0] = 5 3 print(point)
タプルは一度作ったら要素を変更できません。値を書き換えたい場合はリスト([])を使います。
直し方: (1, 2) を [1, 2] にします。
パターン2
1 colors = ("red", "green", "blue") ^ 2 colors[1] = "yellow" 3 print(colors)
丸括弧のタプルと角括弧のリストは見た目が似ていますが、変更可能かどうかが根本的に違います。
直し方: ("red", "green", "blue") を ["red", "green", "blue"] にします。
パターン3
1 coords = (0, 0, 0) ^ 2 coords[2] = 9 3 print(coords)
後から要素を更新する前提のデータはタプルではなくリストで持つのが定石です。
直し方: (0, 0, 0) を [0, 0, 0] にします。
パターン4
1 record = ("Tom", 80) ^ 2 record[1] = 95 3 print(record)
点数を更新する前提のデータをタプルで持つと、この形で書き換えられません。
直し方: ("Tom", 80) を ["Tom", 80] にします。
パターン5
1 rgb = (100, 150, 200) ^ 2 rgb[0] = 255 3 print(rgb)
色の成分を後から調整したい場合も、タプルではなくリストで持つ必要があります。
直し方: (100, 150, 200) を [100, 150, 200] にします。
よくある誤解
リストと同じ感覚でタプルの要素を更新できると思いがちですが、タプルは作成後に中身を変更できない設計です。後から値を更新する前提のデータはリストで持ちます。
実務での勘所
タプルが不変なのは、要素の入れ替えを禁止しているだけで、要素が指している中身までは関知しません。t = ([1, 2], 3)のようにリストを含むタプルを作った場合、t[0] = 何かという代入はエラーになりますが、t[0].append(4)のようにt[0]が指しているリスト自体を変更するのは問題なく実行できます。「タプルの中身は一切変更できない」という理解は正確ではなく、正しくは「タプルのどの位置が何を指しているかは変更できない」という意味の不変性です。