What's the evaluation order of conditional expression in Python?
我知道python中的条件表达式是x if c else y,但是我在使用它时遇到了一些问题。
我有两个代码要比较。
代码1:
1 2 3 4 5 6 7 8 | def fun(p): if len(p) >= 2: p[1] = 'Ok' else: p.append('Ok') p = [1] fun(p) print p |
代码1的输出:
1 | [1, 'Ok'] |
代码2:
1 2 3 4 5 6 | def fun(p): (p[1] = 'Ok') if (len(p) >= 2) else p.append('OK') p = [1] fun(p) print p |
代码2的输出:
1 2 3 | (p[1] = 'Ok') if (len(p) >= 2) else p.append('OK') ^ SyntaxError: invalid syntax |
我知道代码1的格式是"if c:x else:y",评估顺序是:
代码2引发语法错误,原因可能是P[1]不存在。所以我猜"x如果c else y"的格式是这样计算的:
但这只是我的猜测。有人知道代码2错误而代码1正确的真正原因吗?
使用
作业,比如
1 | p[1] = 'Ok' |
是语句,不能是表达式的一部分,包括条件表达式。看看在python中表达式和语句有什么区别?更多信息。
计算的顺序不包含在其中——当对任何代码进行分析时,
在
或
所以,在
1 2 3 4 | if condition: true_statement else: false_statement |
或
1 | true_statement if condition else false_statement |
根据条件的真实性,只评估true或fase语句。
作业不是表达(其他人指出)。因此出现了语法错误。
关于您关于评估顺序的问题:
在if else表达式中(!)首先计算条件操作数,然后计算then操作数(最左边)或else操作数(最右边)。不计算另一个操作数。
在OR表达式中,操作数是从最左到最右(
在和表达式中,操作数是从最左到最右(
内部表达式在外部表达式(当然)之前进行计算:
在所有其他情况下(
正如丹D.指出的,在表达式上下文中不能有语句。
为了学习——我不建议这样做——我将向您展示如何使用内联
1 2 | def fun(p): p.__setitem__(1, 'Ok') if len(p) >= 2 else p.append('OK') |
如您所见,您的第一个版本的可读性要高得多。