【问题标题】:Why does Python not perform type conversion when concatenating strings?为什么 Python 在连接字符串时不进行类型转换?
【发布时间】:2011-09-16 20:29:18
【问题描述】:

在 Python 中,以下代码会产生错误:

a = 'abc'
b = 1
print(a + b)

(错误是“TypeError: cannot concatenate 'str' and 'int' objects”)。

为什么 Python 解释器在遇到这些类型的串联时不会自动尝试使用 str() 函数?

【问题讨论】:

  • “面对歧义,拒绝猜测的诱惑。” (有人不得不说。)
  • 是的,为什么不尝试将'abc'转换为int并加1?苹果+香蕉给你什么?
  • @JBernardo 水果沙拉?

标签: python string type-conversion


【解决方案1】:

问题在于转换不明确,因为+ 表示字符串连接数字加法。以下问题同样有效:

为什么 Python 解释器在遇到 addition 这些类型时不会自动尝试使用 int() 函数?

这正是不幸地困扰着 Javascript 的松散类型问题。

【讨论】:

  • 感觉你应该能够从上下文(print() 函数的参数)中判断这应该是一个字符串,但我想如果没有函数的类型参数,你就无法做到这一点。有理由像这样重载“+”运算符吗?
  • 除了+ 在编程语言中的常见用法之外,没有特定的原因。其他语言使用不同的运算符进行加法和连接; Python 也可以这样做。
  • 很高兴记住这一点,回答一个相反的问题:-) 我喜欢! +1
【解决方案2】:

此类操作存在很大程度的歧义。假设这种情况:

a = '4'
b = 1
print(a + b)

尚不清楚a 是否应强制转换为整数(导致5),或者b 是否应强制转换为字符串(导致'41')。由于类型杂耍规则是可传递的,将数字字符串传递给期望数字的函数可能会给您带来麻烦,尤其是因为几乎所有算术运算符都对字符串进行了重载操作。

例如,在 Javascript 中,为了确保您处理的是整数而不是字符串,通常的做法是将变量乘以 1;在 Python 中,乘法运算符重复字符串,所以 '41' * 1 是一个空操作。最好让开发者澄清一下。

【讨论】:

    【解决方案3】:

    简短的回答是因为 Python 是一种强类型语言。

    这是 Guido 做出的设计决定。它可能真的是一种或另一种方式,将 strint 连接到 strint

    最好的解释,还是guido给出的那个,大家可以查看here

    【讨论】:

    • 强类型本身并不能解释这一点,但是——如果 Python 是强类型和静态类型的,那么解释器可以将函数 print(String str) 的所有参数转换为字符串类型(就像 Java 对 toString 所做的那样())。这是因为 Python 既是强类型又是动态类型,才会出现这个问题。
    【解决方案4】:

    其他答案提供了很好的解释,但没有提到这个功能被称为强类型。执行隐式转换的语言是弱类型的。

    【讨论】:

      【解决方案5】:

      因为 Python 在连接字符串时不进行类型转换。这种行为是设计使然,当您需要将对象强制转换为字符串或数字时,您应该养成执行显式类型转换的习惯。

      将您的代码更改为:

      a = 'abc'
      b = 1
      print(a + str(b))
      

      你会看到想要的结果。

      【讨论】:

        【解决方案6】:

        Python 必须知道字符串中的内容才能正确执行。有一个模棱两可的情况:'5' + 5 应该生成什么?一个数字还是一个字符串?那肯定会引发错误。现在要确定这种情况是否成立,python 必须检查要告诉的字符串。每次您尝试连接或添加两件事时是否应该这样做?最好让程序员显式转换字符串。

        更一般地说,像这样的隐式转换简直令人困惑!它们难以预测、难以阅读和调试。

        【讨论】:

        • 一个字符串。如果你引入字符串,现在你处理的是字符串,而不是数字。如果要对数字进行操作,请保留数字。
        【解决方案7】:

        这就是他们决定设计语言的方式。理由可能是要求显式转换为字符串可以减少意外行为的可能性(例如,如果两个操作数恰好是整数而不是字符串,则整数加法)。

        【讨论】:

          【解决方案8】:

          告诉python int 是一个列表以消除'+'操作的歧义。

          ['foo', 'bar'] + [5]
          

          这会返回:['foo', 'bar', 5]

          【讨论】:

            猜你喜欢
            • 2020-03-01
            • 2015-01-26
            • 2020-09-06
            • 2017-08-25
            • 2011-11-20
            • 1970-01-01
            • 2019-06-07
            • 2021-07-01
            • 2013-10-16
            相关资源
            最近更新 更多