【问题标题】:In Python, why can I multiply a string by a number, but I can't add a string and a number?在Python中,为什么我可以将一个字符串乘以一个数字,但我不能将一个字符串和一个数字相加?
【发布时间】:2014-12-24 21:53:03
【问题描述】:

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

'a' * 4

得到'aaaa'。

我们做不到:

'a' + 4

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

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

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

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

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

【问题讨论】:

  • int * str 记录在 here 中,在语言参考中,而不是在库参考中。 (操作是用int和sequence来定义的,strings是一种sequence。)
  • 这里是more info on sequences in the Library docs,带有操作列表。
  • 要回答您的其他问题,这更多地与重载有关,而不是类型定义。 + 运算符对于某些序列(例如字符串)被重载以表示连接,或者对于列表追加。
  • 字符串乘以字符串会得到什么?

标签: python strong-typing typing


【解决方案1】:

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

本质上,是的。但是,值得注意的是,您所说的两个操作并不是真正并行的。在'a' * 4 中,这两个部分的使用方式不同:字符串用作字符串,数字用作数字。这里没有进行类型转换。还要注意'a' * 44 * 'a'是一样的,因为两个操作数的类型明确了它们的作用,所以顺序无关紧要。

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

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

【讨论】:

    猜你喜欢
    • 2014-07-30
    • 2022-08-18
    • 2017-09-13
    • 2010-10-06
    • 1970-01-01
    • 2023-03-10
    • 2014-03-04
    • 1970-01-01
    相关资源
    最近更新 更多