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

use*_*425 0 python typing strong-typing

在Python中,我们可以做到:

'a' * 4
Run Code Online (Sandbox Code Playgroud)

得到'aaaa'.

我们做不到:

'a' + 4
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Bre*_*arn 11

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

实质上,是的.但是,值得注意的是,你所谈论的两个操作并不是真正平行的.在'a' * 4,两个部分的使用方式不同:字符串用作字符串,数字用作数字.这里没有类型转换.还要注意,它'a' * 4是相同的4 * 'a',因为两个操作数的类型使它们的角色清晰,所以顺序无关紧要.

如果(你似乎想要的话)它起作用'a' + 4'a4',这将是一种不同的操作.这将隐式地使一种类型像另一种类型一样(这里隐式地将int转换为字符串).这可能会导致很多混乱.例如,如果你这样做'1' + 2,你应该得到数字12还是字符串'12'?如果你这样做1 + '2'呢?应该1 + '2'表现得与1 + 'blah'?如果您不再依赖于对象类型来做出决定,那么您必须以其他方式做出决定,而其他任何方式都不会明显或一致.你将再次做出任意选择,例如"总是转换为第一个参数的类型"或"总是转换为字符串".

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