a = None
b = 'Test'
if a is None or b is None:
print('Test')
此版本显然可以运行,但是:
if (a or b) is None:
print('Test')
预期结果将相同,但其结果为False,为什么?
答案 0 :(得分:5)
在Python中,or
语句不仅返回True
或False
,还返回它的第一个参数"truthy"。
在您的代码中,评估(a or b) is None
时会发生以下情况:
None
是虚假的,而a
是None
,因此a or b
返回b
。b
不是None
。(a or b) is None
解析为False
。答案 1 :(得分:4)
布尔表达式的运算符优先级和求值规则在Python中的工作方式有些不同。这不是您想像的那样:
(a or b)
上述条件是询问评估None
的结果是否为None
,并且当前值为a
和{{1}时,它永远不会是b
}; a or b
将返回'Test'
(b
的值),因为a
是None
。如果要测试两个值之一是否为None
,则只有第一种语法有效:
a is None or b is None
请注意,在Python中,x or y
将返回第一个非假表达式的值,而None
,[]
,{}
,{{1} },''
和0
被认为是错误的。如果您要稍微缩短表达式,则相当于您的代码的第一个版本:
False
答案 2 :(得分:0)
如果要简短,可以使用以下结构:
if None in (a, b):
print('Test')
请注意,尽管这在大多数情况下都适用,但该表达式并不完全等同于a is None or b is None
,而是a == None or b == None
。参见explanation,了解为什么这不是同一件事。