Code Fix

初級

文字列と数値を + で連結したエラーの原因と直し方

文字列と数値を + で連結しようとしたときに出るエラーです。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     )
                        ^
Traceback (most recent call last): File "main.py", line 2, in <module> print("Age: " + age) ~~~~~~~~^~~~~ TypeError: can only concatenate str (not "int") to str

+ による文字列連結は両辺が文字列でなければなりません。数値はstr()で明示的に変換します。

直し方: age を str(age) にします。

この問題を解いてみる →

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

パターン2

 1  count = 5
 2  print("count=" + count      )
                          ^
Traceback (most recent call last): File "main.py", line 2, in <module> print("count=" + count) ~~~~~~~~~^~~~~~~ TypeError: can only concatenate str (not "int") to str

「数字に見えるから文字列」ではありません。countはint型なので、そのままでは文字列と連結できません。

直し方: count を str(count) にします。

この問題を解いてみる →

パターン3

 1  x = 3
 2  y = 4
 3  print("sum=" + x + y          )
                          ^
Traceback (most recent call last): File "main.py", line 3, in <module> print("sum=" + x + y) ~~~~~~~^~~ TypeError: can only concatenate str (not "int") to str

計算結果を文字列と連結する場合も、計算を終えた値をstr()で変換します。

直し方: x + y を str(x + y) にします。

この問題を解いてみる →

パターン4

 1  price = 100
 2  print(price       + " yen")
               ^
Traceback (most recent call last): File "main.py", line 2, in <module> print(price + " yen") ~~~~~^~~~~~~~ TypeError: unsupported operand type(s) for +: 'int' and 'str'

数値を先に置くとエラーメッセージの形が変わります(unsupported operand type(s))。どちらの並びでも、文字列と連結する前にstr()で変換します。

直し方: price を str(price) にします。

この問題を解いてみる →

パターン5

 1  pi = 3.14
 2  print("pi=" + pi       )
                      ^
Traceback (most recent call last): File "main.py", line 2, in <module> print("pi=" + pi) ~~~~~~^~~~ TypeError: can only concatenate str (not "float") to str

float型でも同じです。小数点があっても数値は数値なので、str()を挟まないと文字列と連結できません。

直し方: pi を str(pi) にします。

この問題を解いてみる →

よくある誤解

「数字に見えるから文字列と混ぜられる」わけではありません。int型はstr()で明示的に変換しない限り、+ による文字列連結には使えません。

実務での勘所

JavaScriptの"5" + 3が"53"になるような暗黙の型変換を、Pythonは意図的に許していません。+の両辺の型が合っていることを要求することで、「数値のつもりで足したら文字列結合になっていた」という種類のバグを未然に防ぐ設計です。実務では、str(age)を使ってprint("年齢: " + str(age))のように書くより、f"年齢: {age}"というf文字列を使うほうが、変換を意識せずに済むため現在は主流です。

演習をはじめる

関連するエラー

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