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

2024-04-19 18:36:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道Python中的条件表达式是X if 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的输出:

^{pr2}$

代码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. 是的

代码2抛出语法错误,原因可能是p[1]不存在。所以我想“X if C else Y”格式的计算如下:

  1. C
  2. 是的

但那只是我的猜测。有人知道代码2错误而代码1正确的真正原因吗?在


Tags: 代码lenif表达式def格式原因ok
3条回答

赋值不是表达式(其他人指出)。因此出现了语法错误。在

关于您关于评估顺序的问题:

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

-表达式中,操作数从最左到最右(a or b or c or d or ...)计算,但只在找到布尔值为真的操作数之前。其余表达式的计算结果是而不是。在

-表达式中,操作数从左到右(a and b and c and d and ...)计算,但只在找到布尔值为False的操作数之前。其余表达式的计算结果是而不是。在

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

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

之所以有SyntaxError,是因为Python区分语句表达式。在

作业,比如

p[1] = 'Ok'

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

求值的顺序并不是这样的SyntaxError发生在任何代码被解析之前。在

if语句和条件表达式中,求值的顺序是以太

  1. 条件
  2. 真实陈述

  1. 条件
  2. 虚假陈述

所以,在

^{pr2}$

或者

true_statement if condition else false_statement

根据条件的真实性,只计算fase语句的true。在

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

为了便于学习,我不建议这样做,我将向您展示如何使用内联X if C else Y来完成您正在尝试的操作:

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

如您所见,您的第一个版本更具可读性。在

相关问题 更多 >