用 str() 显式转换数字为字符串是最简单安全的修复方式,因 python 不支持 str 与 int 的隐式拼接,如 "age: " + 25 会触发 typeerror。

直接用 str() 把数字转成字符串,是最简单、最安全的修复方式。别拼接前还想着“Python 应该自动转吧”,它不会。
为什么会出现 TypeError: can only concatenate str (not "int") to str
这是 Python 在运行时发现你写了类似 "age: " + 25 这种表达式——+ 左右类型不一致,且 Python 不做隐式类型转换。它只允许 str + str,不允许 str + int。
常见场景包括:
- 日志拼接:
print("User ID: " + user_id),其中user_id是int - 路径构造:
base_path + 123,误把序号当字符串拼 - 格式化前手快用了
+而非 f-string 或.format()
用 str() 转换是最直接的解法
把参与拼接的非字符串值显式转成字符串,就能过。不需要改逻辑,也不依赖第三方库。
示例对比:
user_id = 42 # ❌ 错误写法 # message = "ID: " + user_id # TypeError <h1>✅ 正确写法</h1><p>message = "ID: " + str(user_id) # "ID: 42"</p>
要点:
-
str()对None、负数、浮点数、布尔值都有效(str(True) → "True") - 如果变量可能为
None,str(None)得到"None",不是空字符串——需要空字符串请额外判断 - 嵌套调用没问题:
"Value: " + str(len(items)) + " items"
更推荐的替代写法(避免反复写 str())
虽然 str() 快速有效,但代码可读性和维护性上,以下方式更优:
- f-string(Python 3.6+):
f"ID: {user_id}"—— 自动调用__str__,无需手动转 -
.format():"ID: {}".format(user_id)—— 同样自动处理类型 -
%格式化(不推荐新项目):"ID: %s" % user_id
注意:f-string 中的表达式内部仍需是合法 Python 表达式,比如 f"{len(data)} items" 没问题,但 f"{data.length}"(属性不存在)会抛 AttributeError,和 str() 的错误层级不同。
真正容易被忽略的是:这个错误只在运行时触发,静态检查工具(如 mypy)默认不会报——如果你没写测试或没走到那条分支,上线后才炸。所以,对所有外部输入、数据库字段、API 返回值做拼接前,先确认类型,比事后修 str() 更省事。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











