在Python中,为什么我可以将一个字符串乘以一个数字,但是我不能添加一个字符串和一个数字?

时间:2014-12-24 21:53:04

标签: python strong-typing typing

在Python中,我们可以这样做:

'a' * 4

获得' aaaa'。

我们做不到:

'a' + 4

我们首先必须将4转换为字符串。

这只是一个任意选择,用String和Int arg的定义重载*,并且不为String和Int重载+?

我试图理解这是如何适应正在考虑的Python'强类型',如果我们将其定义为不执行任何隐式类型转换的语言,例如它不是如何在上例中将4转换为字符串。那么在第一个例子中,这是运算符重载的一个例子,而不是隐式转换?

在文档中,我找不到mul或*的定义,它采用Int和String,只有2个Int的形式。我们如何知道存在哪些重载定义?

参考:https://docs.python.org/2/library/operator.html

1 个答案:

答案 0 :(得分:12)

  

这只是一个任意选择,用String和Int arg的定义重载*,并且不为字符串和Int重载+?

实质上,是的。但是,值得注意的是,您所谈论的两个操作并不是真正平行的。在'a' * 4中,两个部分的使用方式不同:字符串用作字符串,数字用作数字。这里没有类型转换。另请注意,'a' * 44 * 'a'相同,因为两个操作数的类型使其角色清晰,因此顺序并不重要。

如果(正如您所希望的那样)它有效,'a' + 4给了'a4',这将是一种不同的操作。这将隐式地使一种类型像另一种类型一样(这里隐式地将int转换为字符串)。这可能会导致很多混乱。例如,如果您执行'1' + 2,是否应该获得号码12或字符串'12'?如果你做1 + '2'怎么办? 1 + '2'的行为应该与1 + 'blah'不同吗?如果您不再依赖于对象类型来做出决定,那么您必须以其他方式做出决定,而其他任何方式都不会明显或一致。您将再次做出任意选择,例如"总是转换为第一个参数的类型"或"始终转换为字符串"。

Python不会打开这样的蠕虫,而是通常避免使用运算符重载来进行隐式类型转换。在可以对不同类型进行操作的情况下,与字符串乘法一样,行为被明确定义为使用每种类型,而不是将其转换为其他类型。