Code Fix

中級

タプルの要素を書き換えようとした原因と直し方

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

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

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] にします。

この問題を解いてみる →

パターン4

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

点数を更新する前提のデータをタプルで持つと、この形で書き換えられません。

直し方: ("Tom", 80) を ["Tom", 80] にします。

この問題を解いてみる →

パターン5

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

色の成分を後から調整したい場合も、タプルではなくリストで持つ必要があります。

直し方: (100, 150, 200) を [100, 150, 200] にします。

この問題を解いてみる →

よくある誤解

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

実務での勘所

タプルが不変なのは、要素の入れ替えを禁止しているだけで、要素が指している中身までは関知しません。t = ([1, 2], 3)のようにリストを含むタプルを作った場合、t[0] = 何かという代入はエラーになりますが、t[0].append(4)のようにt[0]が指しているリスト自体を変更するのは問題なく実行できます。「タプルの中身は一切変更できない」という理解は正確ではなく、正しくは「タプルのどの位置が何を指しているかは変更できない」という意味の不変性です。

演習をはじめる

関連するエラー

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