Python 在 if 语句中使用 and 时的求值顺序

1 投票
2 回答
541 浏览
提问于 2025-04-18 01:38

通常我们会检查一个变量是否是None,或者进行类似的错误处理。有时候你还需要一个额外的if语句,这个语句的判断是基于变量x的:

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

那么你能像这样安全地把这些if语句合并在一起吗(为了让代码更简洁)?

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

或者说,解释器并不能保证在遇到第一个False后就停止评估的顺序吗?

2 个回答

0

没错,因为Python会进行短路运算(维基百科),并且是从左到右进行判断的。

这意味着如果 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问题 "is None" 和 "== None" 有什么区别

4

是的,这样做是安全的,因为运算符 andor 会短路

注意:

  • 如果你想检查一个对象是否是 None,建议使用 is

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

撰写回答