Python 在 if 语句中使用 and 时的求值顺序
通常我们会检查一个变量是否是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