在字符串连接中使用三元运算符时,我在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'
答案 0 :(得分:4)
operator precedence在这里起着至关重要的作用。表达式评估为:
// Store the state outside of the components
const numbers = [1, 2, 3, 4, 5];
let activeNumber = 0;
// A stateless NumberList component takes the numbers and activeNumber props
function NumberList(props) {
// The `active` class is conditionally added to the appropriate `li`
return (
<ul>
{
props.numbers.map((number) =>
<li key={number} className={props.activeNumber === number ? 'active' : ''}>
{number}
</li>
)
}
</ul>
);
}
// Render method takes in the active number
function render(activeNumber) {
ReactDOM.render(
<NumberList numbers={numbers} activeNumber={activeNumber} />,
document.getElementById('root')
);
}
// We set an interval timer to update activeNumber and re-render
setInterval(function() {
if (activeNumber < numbers.length) {
activeNumber++
} else {
activeNumber = 1;
}
render(activeNumber);
}, 1000);
render(); // Initial render
这是因为条件表达式在加法和减法之前。
使用括号强制执行所需的评估顺序:
(foo.upper() + "_" + "") if bar is 0 else str(bar)
或者,可能更好的是将复杂性降低extracting a variable以避免任何可能的混淆:
foo.upper() + "_" + ("" if bar is 0 else str(bar))