为什么Python在连接字符串时不执行类型转换?

时间:2011-06-17 01:32:15

标签: python string type-conversion

在Python中,以下代码会产生错误:

a = 'abc'
b = 1
print(a + b)

(错误是“TypeError:无法连接'str'和'int'对象”。)

为什么Python解释器在遇到这些类型的串联时不会自动尝试使用str()函数?

8 个答案:

答案 0 :(得分:30)

问题是转换不明确,因为+表示字符串连接数字添加。以下问题同样有效:

  

为什么Python解释器在遇到这些类型的添加时不会自动尝试使用 int()函数?

这正是松散打字的问题,不幸的是折磨了Javascript。

答案 1 :(得分:13)

此类操作存在很大程度的模糊性。假设情况改为:

a = '4'
b = 1
print(a + b)

不清楚是否应将a强制转换为整数(导致5),或者b是否应强制转换为字符串(导致'41') 。由于类型杂耍规则是可传递的,因此将数字字符串传递给期望数字的函数可能会让您遇到麻烦,尤其是因为几乎所有算术运算符都对字符串进行了重载操作。

例如,在Javascript中,为了确保处理整数而不是字符串,通常的做法是将变量乘以1;在Python中,乘法运算符重复字符串,因此'41' * 1是一个无操作。最好让开发人员澄清一下。

答案 2 :(得分:5)

简短的回答是因为Python是一种强类型语言。

这是Guido做出的设计决定。它可能是这样或那样的,将 str int 连接到 str int

最好的解释仍然是guido给出的解释,你可以查看它here

答案 3 :(得分:3)

其他答案提供了很好的解释,但没有提到这个功能被称为强类型。执行隐式转换的语言是弱类型。

答案 4 :(得分:2)

因为Python在连接字符串时不执行类型转换。这种行为是设计使然,当您需要将对象强制转换为字符串或数字时,您应养成执行显式类型转换的习惯。

将您的代码更改为:

a = 'abc'
b = 1
print(a + str(b))

你会看到理想的结果。

答案 5 :(得分:2)

Python必须知道字符串中的内容才能正确执行。有一个含糊不清的案例:'5' + 5应该产生什么?一个数字还是一个字符串?那肯定会引发错误。现在要确定这种情况是否成立,python必须检查要告诉的字符串。每次尝试连接或添加两个东西时它应该这样做吗?最好让程序员明确地转换字符串。

更一般地说,像这样的隐式转换只是简单的混乱!它们难以预测,难以阅读,难以调试。

答案 6 :(得分:1)

这就是他们决定设计语言的方式。可能的理由是,要求对字符串进行显式转换会降低意外行为的可能性(例如,如果两个操作数恰好是整数而不是字符串,则为整数加法)。

答案 7 :(得分:1)

告诉python int是一个消除'+'操作歧义的列表。

['foo', 'bar'] + [5]

返回:['foo','bar',5]