Code Fix

中級

TypeError: 'tuple' object does not support item assignment の原因と直し方

タプルの要素を書き換えようとしたときに出るエラーです。丸括弧のタプルと角括弧のリストは見た目が似ていますが、変更可能かどうかが根本的に違います。

エラーメッセージの読み方

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)
Traceback (most recent call last): File "main.py", line 2, in <module> point[0] = 5 ~~~~~^^^ TypeError: 'tuple' object does not support item assignment

タプルは一度作ったら要素を変更できません。値を書き換えたい場合はリスト([])を使います。

直し方: (1, 2)[1, 2] にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  colors = ("red", "green", "blue")
                         ^
 2  colors[1] = "yellow"
 3  print(colors)
Traceback (most recent call last): File "main.py", line 2, in <module> colors[1] = "yellow" ~~~~~~^^^ TypeError: 'tuple' object does not support item assignment

丸括弧のタプルと角括弧のリストは見た目が似ていますが、変更可能かどうかが根本的に違います。

直し方: ("red", "green", "blue")["red", "green", "blue"] にします。

この問題を解いてみる →

パターン3

 1  coords = (0, 0, 0)
                 ^
 2  coords[2] = 9
 3  print(coords)
Traceback (most recent call last): File "main.py", line 2, in <module> coords[2] = 9 ~~~~~~^^^ TypeError: 'tuple' object does not support item assignment

後から要素を更新する前提のデータはタプルではなくリストで持つのが定石です。

直し方: (0, 0, 0)[0, 0, 0] にします。

この問題を解いてみる →

よくある誤解

リストと同じ感覚でタプルの要素を更新できると思いがちですが、タプルは作成後に中身を変更できない設計です。後から値を更新する前提のデータはリストで持ちます。

まとめ

TypeError: 'tuple' object does not support item assignmentは中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)