ホーム › エラー解決 › Python › TypeError(str+int)
Python ERROR

Python TypeError: can only concatenate str の解決法

文字列と数値をそのまま<code>+</code>でつなごうとすると起きるエラーです。5つの原因パターンと、逆順・input()・リストで出る別メッセージの違いまで解説します。

このエラーメッセージ

TypeError: can only concatenate str (not "int") to str

原因

❌ エラーになるコード

NG
age = 20
print("私は" + age + "歳です")

✅ 修正したコード

OK
age = 20
print("私は" + str(age) + "歳です")
# f文字列ならさらに簡単
print(f"私は{age}歳です")
▶ 修正済みコードを実行エディタで開く
progoのPython実行環境(インストール不要・登録不要)でその場で動作を確認できます。

解決のポイント

数値を文字列と連結するときはstr()で文字列に変換します。もっと読みやすいのはf文字列で、f"私は{age}歳です"と書けば型変換を意識せずに埋め込めます。

メッセージ別の早見表

can only concatenate str (not "int") to str文字列 + 整数
can only concatenate str (not "float") to str文字列 + 小数
unsupported operand type(s) for +: 'int' and 'str'数値 + 文字列(逆順)
can only concatenate list (not "str") to listリスト + 文字列

input()から受け取った値で起きるケース

input()の戻り値は常にstr型です。数値のつもりで直接+すると、同じTypeErrorになります。

NG
age = input("年齢を入力: ")  # "20" のようなstr型
print("来年は" + (age + 1) + "歳")  # TypeError
OK
age = int(input("年齢を入力: "))  # 先にintへ変換
print("来年は" + str(age + 1) + "歳")

逆順「数値 + 文字列」のケース

文字列を先に書くか数値を先に書くかで、メッセージの型名の順番が変わります。原因と対処は同じです。

TypeError: unsupported operand type(s) for +: 'int' and 'str'
NG
count = 3
print(count + "個")
OK
count = 3
print(str(count) + "個")

リストに文字列を足すケース

リスト同士の+は連結できますが、リストに文字列を直接足すと専用のエラーになります。

TypeError: can only concatenate list (not "str") to list
NG
nums = [1, 2, 3]
result = nums + "4"  # TypeError
OK
nums = [1, 2, 3]
nums.append(4)           # 1件追加するなら
result = nums + [4]      # リスト同士で連結するなら

よくある質問

「can only concatenate str」と「unsupported operand type(s) for +」の違いは?
連結する順番の違いです。「文字列 + 数値」の順だとcan only concatenate str (not "int") to str、「数値 + 文字列」の順だとunsupported operand type(s) for +: 'int' and 'str'になります。原因も対処も同じで、数値側をstr()で変換します。
input()を使うとなぜこのエラーが出やすい?
input()の戻り値は常にstr型だからです。数値のつもりでも文字列のままなので、他の数値と+で連結しようとするとTypeErrorになります。計算に使うならint(input())やfloat(input())で先に変換してください。
リストで出る「can only concatenate list」とは?
リストに文字列を+で直接足そうとしたときのエラーです(can only concatenate list (not "str") to list)。リスト同士の+はOKなので、足す値もlist("4")のようにリスト化するか、appendを使います。
逆に文字列を数値にしたいときは?
int("20") や float("3.14") を使います。数字以外が含まれるとValueErrorになります。
f文字列とstr()どちらがいい?
可読性が高いf文字列が推奨です。Python3.6以降で使えます。
+=(累算代入)でも同じエラーになる?
なります。x += age は x = x + age と同じ意味なので、xが文字列でageが数値なら同じTypeErrorが出ます。x += str(age)にすれば解決します。
なぜJavaScriptでは同じことをしてもエラーにならないの?
JavaScriptの+は片方が文字列なら自動で他方も文字列に変換します(暗黙の型変換)。Pythonは暗黙変換をしない設計のため、str()での明示的な変換が必要です。