2014-12-24 99 views
0

在Python中,我们可以这样做:在Python中,为什么我可以用一个数乘以一个字符串,但是我不能添加一个字符串和一个数字?

'a' * 4 

获得 'AAAA'。

我们不能做:

'a' + 4 

我们首先要投4中为一个字符串。

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

我想了解这是如何适合Python被认为是'强类型',如果我们将语言定义为不执行任何隐式类型转换,就像它不是将4转换为上面示例中的字符串那样。所以在第一个例子中,这是一个运算符重载的例子,而不是一个隐式转换?

在文档中,我无法找到mul或*的定义,它只接受一个I​​nt和一个字符串,而只是需要2个Ints的形式。我们如何知道重载的定义是什么?

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

+6

'int * str'在文档[这里](https://docs.python.org/2/reference/expressions.html#binary-arithmetic-operations)中,在语言引用中,不是库引用。 (操作用int和序列来定义,字符串是一种序列。) – jwodder

+1

这里是[图书馆文档中序列的更多信息](https://docs.python.org/2/library /stdtypes.html#typesseq)以及一系列操作。 –

+1

要回答你的其他问题,这与重载有关,而不是类型定义。对于某些序列(例如字符串),'+'运算符被重载以表示串联,或者列表追加。 –

回答

12

这只是超载任意选择*有定义的String和Int阿根廷,并且不超载+一个字符串和诠释?

从本质上讲,是的。但值得注意的是,你所谈论的这两个操作并不是真的平行。在'a' * 4中,两部分的用法不同:字符串用作字符串,数字用作数字。这里没有类型转换。还请注意,'a' * 44 * 'a'相同,因为两个操作数的类型使其角色清晰,所以顺序无关紧要。

如果(如你所愿)它的工作使'a' + 4给了'a4',这将是一种不同的操作。这将隐含地使一个类型像另一个类型一样行为(这里隐式地将int转换为字符串)。这可能会导致很多混淆。例如,如果你做'1' + 2,你应该得到12还是字符串'12'?那么如果你做1 + '2'1 + '2'的行为与1 + 'blah'有什么不同?如果您不再依赖对象类型来做出决定,则必须以其他方式来决定,而其他方式都不会明显或一致。您将再次必须进行任意选择,例如“总是转换为第一个参数的类型”或“总是转换为字符串”。

Python并没有打开这样的蠕虫罐,而是通常避免使用运算符重载来进行隐式类型转换。如果可以在不同类型的操作上进行操作(如字符串乘法),则会特别定义该行为,以便按照原样使用每种类型,而不是将其转换为其他类型。

相关问题