【问题标题】:Reason for the inability to concatenate strings and ints in Python [duplicate]无法在 Python 中连接字符串和整数的原因 [重复]
【发布时间】:2023-04-11 11:29:01
【问题描述】:

大量文献证明,str 需要将 int 转换为字符串,然后才能连接它们:

'I am ' + str(n) + ' years old.'

Python 不允许这样做一定有一个根本原因

'I am ' + n + ' years old.'

我想知道这个原因是什么。在我的项目中,我打印了很多数字并最终得到这样的代码。

'The GCD of the numbers ' + str(a) + ', ' + str(b) + ' and ' + str(c) + ' is ' + str(ans) + '.'

如果我能去掉'str'会更漂亮。这就是让我的经历特别令人烦恼的原因。我正在使用 SymPy,所以我有这样的代码:

'Consider the polynomial ' + (a*x**2 + b*x + c)

这在 99% 的时间都有效,因为我们为 SymPy 表达式和字符串重载了“+”。但是对于整数我们不能这样做,因此,当 a=b=0 并且多项式减少为整数常量时,此代码将失败!所以对于那个异常情况,我不得不写:

'Consider the polynomial ' + str(a*x**2 + b*x + c)

同样,'string' + str(int) 的解决方案很简单,但我的帖子的目的是理解 Python 不允许 'string' + int 的方式,例如,Java 允许。

【问题讨论】:

  • 因为显式优于隐式;连接需要显式转换,对象通常不会被隐式强制转换。
  • 你真的应该了解str.format()'The GCD of the numbers {}, {} and {} is {}.'.format(a, b, c, ans)。 Python 3.6 及更高版本提供f 字符串:f'The GCD of the numbers {a}, {b} and {c} is {ans}.'
  • 一些解释可以在这里找到:softwareengineering.stackexchange.com/q/304445/202154
  • @MartijnPieters 奇怪,但你可以对 print("I am ", n, " years old.") 做同样的事情,而且没有人会因为某种原因抱怨隐式转换。所以用逗号替换“+”运算符突然就可以了?
  • @BulgarSadykov print() 显式使用str()as documented将所有参数转换为字符串:所有非关键字参数都转换为@987654335之类的字符串@ 会print() 有一个明确的、狭窄的用例,+ 运算符有一个更广泛的用例,远远超出了字符串。

标签: python string int operator-overloading concatenation


【解决方案1】:

您可以使用 "," 代替 "+"

a=4
x=5
b=6
c=5
n=100
my_age="I am",n,"Years old"
print("I may say",my_age)

print('Consider the polynomial ' ,(a*x**2 + b*x + c))

【讨论】:

    【解决方案2】:

    它与+ 运算符有关。

    使用+运算符时,根据与运算符结合使用的ab变量类型,可能会调用两个函数:

    operator.concat(a, b)operator.add(a, b)

    .concat(a, b) 方法为序列返回 a + b

    .add(a, b) 方法为数字返回 a + b

    这可以在 pydocs here 中找到。

    Python 不会隐式转换变量类型以便函数“工作”。这对代码来说太混乱了。所以你必须满足+运营商的要求才能使用它。

    【讨论】:

    • Java 的设计者认为这是一个好主意而 Python 的设计者认为这是一个坏主意,有什么原因吗?设计的根本区别是什么?
    • @Lem.ma 我不太确定为什么,但我很肯定这与两种语言选择处理类型强制的方式有关。对于某些情况,我建议您阅读有关字符串格式的信息以代替串联。你可以阅读更多关于它的信息here
    最近更新 更多