Python中条件表达式的评估顺序是什么?

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",评估顺序是:

  • C
  • X
  • Y
  • 代码2引发语法错误,原因可能是P[1]不存在。所以我猜"x如果c else y"的格式是这样计算的:

  • X
  • C
  • Y
  • 但这只是我的猜测。有人知道代码2错误而代码1正确的真正原因吗?


    使用SyntaxError的原因是因为python区分了语句和表达式。

    作业,比如

    1
    p[1] = 'Ok'

    是语句,不能是表达式的一部分,包括条件表达式。看看在python中表达式和语句有什么区别?更多信息。

    计算的顺序不包含在其中——当对任何代码进行分析时,SyntaxError发生在对其进行计算之前。

    if语句和条件表达式中,计算的顺序是ether

  • 条件
  • 真实陈述
  • 条件
  • 虚假陈述
  • 所以,在

    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表达式中,操作数是从最左到最右(a or b or c or d or ...)进行计算的,但直到找到布尔值为真的操作数为止。不计算其余表达式。

    在和表达式中,操作数是从最左到最右(a and b and c and d and ...)进行计算的,但直到找到布尔值为假的操作数为止。不计算其余表达式。

    内部表达式在外部表达式(当然)之前进行计算:third(second(first()))

    在所有其他情况下(a() + b()f(g(), h())a[b] = d() + e,订单定义如下。通常它是从左到右的,除了赋值(它在左前右)。


    正如丹D.指出的,在表达式上下文中不能有语句。

    为了学习——我不建议这样做——我将向您展示如何使用内联X if C else Y来完成您要做的工作:

    1
    2
    def fun(p):
        p.__setitem__(1, 'Ok') if len(p) >= 2 else p.append('OK')

    如您所见,您的第一个版本的可读性要高得多。