为啥三元条件不适用于字符串连接

Posted

技术标签:

【中文标题】为啥三元条件不适用于字符串连接【英文标题】:Why ternary condition not working perfectly for string concatenation为什么三元条件不适用于字符串连接 【发布时间】:2018-06-13 18:51:51 【问题描述】:

在字符串连接中使用三元运算符时,我在 python 中看到了一种特殊的行为 -

>>> foo = "foo"
>>> foo.upper()
'FOO'
>>> bar = 2
>>> "" if bar is 0 else str(bar)
'2'
>>> foo.upper() + "_" + "" if bar is 0 else str(bar)
'2'

使用上面的代码,我期望它应该输出为FOO_2,但只显示2。虽然我可以用下面的代码实现输出。谁能解释为什么它不能与 + 一起使用?

>>> "_".format(foo.upper(), "" if bar is 0 else str(bar))
'FOO_2'

【问题讨论】:

docs.python.org/3/reference/… 除此之外:这与您的问题无关,但不要在您的意思是 == 的地方使用 is - 请参阅 here 或 here。 【参考方案1】:

operator precedence 在这里起着至关重要的作用。表达式被计算为:

(foo.upper() + "_" + "") if bar is 0 else str(bar)

这是因为条件表达式先于加减法。

使用括号强制执行您想要的评估顺序:

foo.upper() + "_" + ("" if bar is 0 else str(bar))

或者,可能更好的是通过extracting a variable 降低复杂性以避免任何可能的混淆:

postfix = "" if bar is 0 else str(bar)
print(foo.upper() + "_" + postfix)

【讨论】:

以上是关于为啥三元条件不适用于字符串连接的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb Atlas 连接字符串不适用于 Zapier

为啥这种“嵌套连接”适用于 PDO 而不适用于 MySql cli?

使用 pyodbc 模块的连接字符串不适用于 Enthought Python Distribution

何时/为啥要在 SQL 中使用 QUOTENAME?

为啥 C 在使用条件运算符时不允许连接字符串?

JTDS 与 SQL Server 的连接问题 - 适用于 2000 但不适用于 2005