文字列と数値を + で連結したエラーの原因と直し方
文字列と数値を + で連結しようとしたときに出るエラーです。Pythonの + は両辺の型が揃っていないと使えません。
エラーメッセージの読み方
Traceback (most recent call last):
main.py- ファイル名
2- 行番号 — 実際にクラッシュした行
<module>- 発生場所 — <module> ならトップレベル、関数名ならその関数の中
TypeError- 例外クラス — 何が起きたか。ここを検索するのが最短です
can only concatenate str (not "int") to str- 詳細メッセージ — どの値が問題だったか
このエラーが出る典型パターン
パターン1
1 age = 20 2 print("Age: " + age ) ^
+ による文字列連結は両辺が文字列でなければなりません。数値はstr()で明示的に変換します。
直し方: age を str(age) にします。
パターン2
1 count = 5 2 print("count=" + count ) ^
「数字に見えるから文字列」ではありません。countはint型なので、そのままでは文字列と連結できません。
直し方: count を str(count) にします。
パターン3
1 x = 3 2 y = 4 3 print("sum=" + x + y ) ^
計算結果を文字列と連結する場合も、計算を終えた値をstr()で変換します。
直し方: x + y を str(x + y) にします。
パターン4
1 price = 100 2 print(price + " yen") ^
数値を先に置くとエラーメッセージの形が変わります(unsupported operand type(s))。どちらの並びでも、文字列と連結する前にstr()で変換します。
直し方: price を str(price) にします。
パターン5
1 pi = 3.14 2 print("pi=" + pi ) ^
float型でも同じです。小数点があっても数値は数値なので、str()を挟まないと文字列と連結できません。
直し方: pi を str(pi) にします。
よくある誤解
「数字に見えるから文字列と混ぜられる」わけではありません。int型はstr()で明示的に変換しない限り、+ による文字列連結には使えません。
実務での勘所
JavaScriptの"5" + 3が"53"になるような暗黙の型変換を、Pythonは意図的に許していません。+の両辺の型が合っていることを要求することで、「数値のつもりで足したら文字列結合になっていた」という種類のバグを未然に防ぐ設計です。実務では、str(age)を使ってprint("年齢: " + str(age))のように書くより、f"年齢: {age}"というf文字列を使うほうが、変換を意識せずに済むため現在は主流です。