在Python中,我们可以这样做:
'a' * 4
获得' aaaa'。
我们做不到:
'a' + 4
我们首先必须将4转换为字符串。
这只是一个任意选择,用String和Int arg的定义重载*,并且不为String和Int重载+?
我试图理解这是如何适应正在考虑的Python'强类型',如果我们将其定义为不执行任何隐式类型转换的语言,例如它不是如何在上例中将4转换为字符串。那么在第一个例子中,这是运算符重载的一个例子,而不是隐式转换?
在文档中,我找不到mul或*的定义,它采用Int和String,只有2个Int的形式。我们如何知道存在哪些重载定义?
答案 0 :(得分:12)
这只是一个任意选择,用String和Int arg的定义重载*,并且不为字符串和Int重载+?
实质上,是的。但是,值得注意的是,您所谈论的两个操作并不是真正平行的。在'a' * 4
中,两个部分的使用方式不同:字符串用作字符串,数字用作数字。这里没有类型转换。另请注意,'a' * 4
与4 * 'a'
相同,因为两个操作数的类型使其角色清晰,因此顺序并不重要。
如果(正如您所希望的那样)它有效,'a' + 4
给了'a4'
,这将是一种不同的操作。这将隐式地使一种类型像另一种类型一样(这里隐式地将int转换为字符串)。这可能会导致很多混乱。例如,如果您执行'1' + 2
,是否应该获得号码12
或字符串'12'
?如果你做1 + '2'
怎么办? 1 + '2'
的行为应该与1 + 'blah'
不同吗?如果您不再依赖于对象类型来做出决定,那么您必须以其他方式做出决定,而其他任何方式都不会明显或一致。您将再次做出任意选择,例如"总是转换为第一个参数的类型"或"始终转换为字符串"。
Python不会打开这样的蠕虫,而是通常避免使用运算符重载来进行隐式类型转换。在可以对不同类型进行操作的情况下,与字符串乘法一样,行为被明确定义为使用每种类型,而不是将其转换为其他类型。