用if语句中的ands进行python评估的顺序

时间:2014-04-06 22:26:47

标签: python execution

检查None或者有类似的错误捕获是很常见的。有时您还需要另一个依赖于x的语句:

if x == None:
   if x[0]>0:
     ... # some code

你能安全地组合这样的if语句(代码简洁)吗?

if x != None and x[0]>0:
     ... # some code

或者解释员是否不保证评估顺序并在第一个错误后停止?

2 个答案:

答案 0 :(得分:3)

是的,这是安全的,因为运营商and and or short-circuits

注意:

  • 如果您想检查对象是否为is,建议使用None

    if x is not None and x[0] > 0:
        # ...
    

答案 1 :(得分:0)

是的,因为Python并且被短路(wikipedia)并从左到右进行评估。

这意味着如果x == None,它将不会评估其余部分:Python已经知道完整and的评估将是False,因为: False and True and True and True仍为False

请考虑以下事项:

x = None    
if x is not None and a != "test":
    print "Point 1"
else:
    print "Point 2"

变量a未在任何地方初始化,对吧?如果Python遇到这一点,你会得到一个Name Error异常,但你得到的是:

Point 2

意味着Python甚至不打算评估a != "test"部分。

or发生了类似的事情。如果任何条件为True,则Python停止评估:

以下代码:

x = None
if x is None or a != "test":
    print "Point 1"
else:
    print "Point 2"

不会抛出异常,但输出

Point 1

奖金

当检查变量是否为None时,建议使用is(或is not)而不是==!=(如SO问题中所述){ {3}})