🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

搞定 Python 的 TypeError!“类型不匹配”错误的简易解决方法

你好!写这篇文章的我,在几个月前还是一个连编程是什么都不知道的纯粹的初学者。在 AI 的帮助下,我现在已经能够独立运营两个网站了。

在学习编程的过程中,任何人都会遇到那个红色的错误信息。特别是“TypeError”,刚开始的时候真的完全搞不懂,很容易让人感到沮丧,我当时也是这样。

但请放心。在本文中,我将根据自己实际遇到的问题,用最通俗易懂的语言,尽量不使用专业术语,来解释“TypeError是什么?”以及“如何解决它?”。读完这篇文章,你将不再害怕TypeError,甚至会把它看作是提供解决线索的“好帮手”!


话说回来,“TypeError”到底是什么?🤔

我们先来做一个小测验。下面的计算能完成吗?

“数字 10” + “文字 '元'”

直觉上感觉会变成“10元”,对吧?那么,这个呢?

“数字 10” + “文字 '个苹果'”

...这个就没法计算了吧。“10个苹果”?这说不通啊。

实际上,Python 也面临着完全相同的问题。对于 Python 来说,数字(专业术语叫 `int` 或 `float`)文字(专业术语叫 `str`)是完全不同的东西。就像人类无法将“数字10”和“文字'个苹果'”相加一样,当 Python 试图混合不同类型的数据进行计算时,它会因为“不知道该用哪种类型(Type)来计算啊!”而陷入混乱。

这种“因类型不同而引起的混乱”,正是`TypeError`的真面目。错误信息其实是在亲切地提醒我们:“主人!您尝试计算的数据类型(Type)不匹配,所以出错了(Error)!”


【实践】体验并解决常见的TypeError!

大致理解了原理之后,让我们马上通过实际代码来体验一下`TypeError`,并看看解决它的过程吧。只要模仿这个分步教程,你也能掌握解决错误的技巧。

情况1:尝试用“+”连接数字和文字

首先是最常见的情况。假设你为了创建一个表示年龄的句子,写了如下代码。

❌ 导致错误的代码

复制并运行这段代码,就会出现`TypeError`。

nian_ling = 30
print("我的年龄是" + nian_ling + "岁。")
# 运行结果:
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: can only concatenate str (not "int") to str


出现了,`TypeError`。我们来看看错误信息的最后一行。
TypeError: can only concatenate str (not "int") to str
它的意思是:“`str`(字符串)只能和`str`(字符串)连接(concatenate),不能和`int`(整数)连接!” 这就是 Python 在告诉我们:“文字‘我的年龄是’和数字`30`不能直接相加!”


🕵️‍♂️ 调查原因:确认类型是否真的不同

我们知道了错误的原因是“类型不同”。那么,我们来直接问问 Python,确认一下情况。要查看变量的类型,可以使用一个很方便的函数`type()`。

wen_ben = "我的年龄是"
nian_ling = 30

print( type(wen_ben) )
print( type(nian_ling) )

# 运行结果:
# <class 'str'>
# <class 'int'>


如你所见,`wen_ben`是字符串`str`,而`nian_ling`是整数`int`。这样就确定了它们的类型是不同的。


✅ 解决方案①:用 `str()` 将数字变为字符串

知道了原因,剩下的就简单了。我们只需要把数字`nian_ling`变成文字就行了。实现这个魔法的就是 `str()` 函数。只需用`str()`把变量包起来,任何类型都能转换成字符串。

nian_ling = 30
# 使用 str() 将数字 nian_ling 转换为字符串!
print("我的年龄是" + str(nian_ling) + "岁。")

# 运行结果:
# 我的年龄是30岁。


成功了!没有报错,并且正确显示了。这就是解决`TypeError`的基本方法。


✅ 解决方案②(推荐):用 f-string 优雅地解决!

虽然`str()`可以解决问题,但还有一种更现代、更易读的方法,那就是“f-string”

只需在字符串的第一个引号前加上一个 `f`,然后用花括号 `{}` 把变量名括起来。这样,Python 就会自动将变量漂亮地转换成文字并嵌入其中。既不需要用 `+` 连接,也不需要用 `str()` 转换。

nian_ling = 30
# 使用 f-string,代码如此清爽!
print(f"我的年龄是{nian_ling}岁。")

# 运行结果:
# 我的年龄是30岁。


怎么样?这种方式是不是代码更短,更直观易懂?今后在组合字符串和变量时,我强烈推荐使用f-string!


情况2:用户输入的陷阱 `input()`

在网站或应用中,有很多场景需要用户输入信息。在 Python 中,我们使用`input()`函数来接收用户输入,但这里有一个大陷阱。

❌ 导致错误的代码

让我们来写一段代码,让用户输入出生年份,然后计算当前年龄(以2025年为准)。

chusheng_nianfen = input("请输入你的出生年份(公历): ")
nian_ling = 2025 - chusheng_nianfen
print(f"你的年龄是{nian_ling}岁吧!")

# 运行(例如输入 1995):
# 请输入你的出生年份(公历): 1995
#
# 运行结果:
# Traceback (most recent call last):
#   File "<stdin>", line 2, in <module>
# TypeError: unsupported operand type(s) for -: 'int' and 'str'


又是一个`TypeError`。这次的信息是unsupported operand type(s) for -: 'int' and 'str'。它是在说:“`-`(减法)运算不支持`int`(整数)和`str`(字符串)的组合。”

你可能会想:“咦?我输入的是1995,为什么会是文字呢?” 这一点非常重要。

通过`input()`函数接收到的值,无论看起来多么像数字,都会被当作字符串(`str`)来处理。

这是 Python 的一条铁律,最好记下来。用`type()`检查一下就一目了然了。

chusheng_nianfen = input("请输入你的出生年份(公历): ")
print(f"输入的数据类型是: {type(chusheng_nianfen)}")

# 运行(例如输入 1995):
# 请输入你的出生年份(公历): 1995
#
# 运行结果:
# 输入的数据类型是: <class 'str'>

✅ 解决方案:用 `int()` 将字符串变为数字

原因是`input()`导致`chusheng_nianfen`变成了字符串(`str`)。为了进行计算,我们需要把它变成数字(`int`)。

这时就要用到 `int()` 函数了,它和`str()`正好相反。我们把从`input()`接收到的值整个用`int()`包起来就行了。

# 立即用 int() 将 input() 的结果转换为数字!
chusheng_nianfen_str = input("请输入你的出生年份(公历): ")
chusheng_nianfen_int = int(chusheng_nianfen_str)

nian_ling = 2025 - chusheng_nianfen_int
print(f"你的年龄大约是{nian_ling}岁吧!")

# 运行(例如输入 1995):
# 请输入你的出生年份(公历): 1995
#
# 运行结果:
# 你的年龄大约是30岁吧!


完美计算成功!只要记住,用了`input()`之后,如果要计算,就先用`int()`转换。掌握了这个组合,就再也不用怕了。


【AI时代的学习法】遇到TypeError就去问AI!

我之所以能这么快地摆脱编程新手阶段,是因为我把 AI 当作了伙伴。即使出现错误信息,也无需惊慌。现在,优秀的 AI 助手随时都在我们身边。

当出现错误时,复制“导致错误的代码”“显示的所有错误信息”,然后像下面这样去问 AI 吧。

【神奇的提示语(问题)】

我运行下面的 Python 代码时,出现了以下错误。
请用初学者也能看懂的方式,结合具体例子,解释一下这个错误的原因和解决方法。

▼ 代码
```python # 在这里粘贴导致错误的代码 nian_ling = 30 print("我的年龄是" + nian_ling + "岁。") ```

▼ 错误信息
``` # 在这里粘贴显示的所有错误信息 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate str (not "int") to str ```


这样提问,AI 就会像本文一样,耐心地告诉你“为什么会出错”以及“如何修复”。让我们充分利用 AI 这个最好的学习工具,把错误变成成长的机会吧!


总结:TypeError是朋友🤝

这次,我们解释了许多初学者都会遇到的`TypeError`的真面目和解决方法。最后,让我们来回顾一下要点。

错误是善意的提示,它指出了你代码中的问题。当你看到`TypeError`时,如果能想到“OK,该检查类型了”,那么你就已经从初学者毕业了。今后你还会遇到很多错误,但通过一个一个地解决它们,你一定会不断进步。我为你加油!

下一步

对于已经掌握了`TypeError`的你,接下来要不要挑战一下在读写文件时常遇到的另一个棘手错误——“乱码”问题呢?只要了解了原因,它也并不可怕。

下一篇文章:如何处理UnicodeDecodeError(乱码问题)»