TypeError: 'str' object does not support item assignment の原因と直し方
文字列の一部を直接書き換えようとしたときに出るエラーです。Pythonの文字列は不変(immutable)です。
エラーメッセージの読み方
Traceback (most recent call last):
main.py- ファイル名
2- 行番号 — 実際にクラッシュした行
<module>- 発生場所 — <module> ならトップレベル、関数名ならその関数の中
TypeError- 例外クラス — 何が起きたか。ここを検索するのが最短です
'str' object does not support item assignment- 詳細メッセージ — どの値が問題だったか
このエラーが出る典型パターン
パターン1
1 name = "tom" 2 name[0] = "T" ^ 3 print(name)
Traceback (most recent call last):
File "main.py", line 2, in <module>
name[0] = "T"
~~~~^^^
TypeError: 'str' object does not support item assignment
文字列は不変(immutable)なので、一部だけを書き換えることはできません。新しい文字列を作って変数に代入し直します。
直し方: name[0] = "T" を name = "T" + name[1:] にします。
広告
広告スロット(未設定)
パターン2
1 s = "hello" 2 s[-1] = "O" ^ 3 print(s)
Traceback (most recent call last):
File "main.py", line 2, in <module>
s[-1] = "O"
~^^^^
TypeError: 'str' object does not support item assignment
末尾の文字を変えたい場合も同様です。スライスで前半部分を取り出し、新しい文字をつなげて再代入します。
直し方: s[-1] = "O" を s = s[:-1] + "O" にします。
パターン3
1 word = "cat" 2 word[1] = "u" ^ 3 print(word)
Traceback (most recent call last):
File "main.py", line 2, in <module>
word[1] = "u"
~~~~^^^
TypeError: 'str' object does not support item assignment
真ん中の文字を変える場合も、前後をスライスで切り出して新しい文字列に組み立て直します。
直し方: word[1] = "u" を word = word[0] + "u" + word[2:] にします。
よくある誤解
リストの要素のように書き換えられると思われがちですが、文字列は一度作られたら中身を変更できません。変更したい場合は新しい文字列を作って再代入します。
まとめ
TypeError: 'str' object does not support item assignmentは中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。