为什么三元条件不能完美地用于字符串连接

时间:2018-01-04 04:07:59

标签: python python-3.x ternary-operator string-concatenation

在字符串连接中使用三元运算符时,我在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'

1 个答案:

答案 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))