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

时间:2012-03-22 09:05:04

标签: python conditional-operator

我知道Python中的条件表达式是X,如果C else Y,但我在使用它时遇到了一些问题。

我有两个代码需要比较。

代码1:

def fun(p):
    if len(p) >= 2:
        p[1] = 'Ok'
    else:
        p.append('Ok')
p = [1]
fun(p)
print p

输出代码1:

[1, 'Ok']

代码2:

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

p = [1]
fun(p)
print p

输出代码2:

    (p[1] = 'Ok') if (len(p) >= 2) else p.append('OK')
      ^
SyntaxError: invalid syntax

我知道在代码1中,其格式为“if C:X else:Y”,评估顺序为:

  1. C
  2. X
  3. ý
  4. 代码2抛出语法错误,原因可能是p [1]不存在。所以我猜测格式“X if C else Y”的评估如下:

    1. X
    2. C
    3. ý
    4. 但这只是我的猜测。有没有人知道代码1错误时代码2错误的真正原因?

3 个答案:

答案 0 :(得分:4)

您拥有SyntaxError的原因是因为Python区分语句表达式

作业,如

p[1] = 'Ok'

语句,不能是表达式的一部分,包括条件表达式。有关详细信息,请参阅What is the difference between an expression and a statement in Python?

评估顺序没有进入 - SyntaxError任何代码被评估之前发生,当它被解析时。

if语句和条件表达式中,评估顺序为 ether

  1. 条件
  2. 真实陈述
    1. 条件
    2. 虚假陈述
    3. 所以,在

      if condition:
          true_statement
      else:
          false_statement
      

      true_statement if condition else false_statement
      

      只评估fase语句的真实,具体取决于条件的真实性。

答案 1 :(得分:0)

正如Dan D.指出的那样,你不能在表达语境中有陈述。

为了学习 - 我不建议这样做 - 我将向您展示如何使用内联X if C else Y来完成您尝试做的事情:

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

正如您所看到的,您的拳头版本更具可读性。

答案 2 :(得分:0)

作业没有表达(其他人指出了)。因此语法错误。

关于评估顺序的问题:

首先在 if-else 表达式(!)中计算条件操作数,然后计算then-operand(最左边)或else-operand(最右边)。另一个操作数是评估。

- 表达式中,操作数从最左边到最右边(a or b or c or d or ...)进行评估,但直到找到一个布尔值为True的操作数。其余的表达式评估。

- 表达式中,操作数从最左边到最右边(a and b and c and d and ...)进行计算,但直到找到一个布尔值为False的操作数。其余的表达式评估。

在外部表达式(当然)之前评估内部表达式:third(second(first()))

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