Python:用'or'运算符比较字符串

Python: Compare strings with 'or' operator

在Python3教程中说"It is possible to assign the result of a comparison or other Boolean expression to a variable."给出的例子是:

>>> string1, string2, string3 = '', 'Trondheim', 'Hammer Dance'
>>> non_null = string1 or string2 or string3
>>> non_null
'Trondheim'

'or' 运算符在比较字符串时究竟做了什么?为什么选择 'Trondheim'?

or returns 如果为真则左边的值,否则右边的值。

对于字符串,只有 ""(空字符串)不是真的,其他都是。

所以

>>> "" or "Test"
"Test"

>>> "One" or "Two"
"One"

它根本不做比较。

包括or select第一个非假字符串(从左到右检查),在本例中是'Trondheim'

>>> bool('')
False
>>> bool('Trondheim')
True

在执行这种类型的检查时有时更可取 strip 字符串文字作为空白 space 也是真实的,如果你不打算 select 白色 spaces.

>>> bool(' ')
True

当被视为布尔值时,空字符串将 return False 而非空字符串将 return True.

由于Python支持短路,在表达式a or b中,如果a为True,b将不会被计算。

在您的示例中,我们有 '' or 'Trondheim' or 'Hammer Dance'

这个表达式是从左到右求值的,所以首先求值的是'' or 'Trondheim',或者换句话说False or True,即returns True。接下来,Python 尝试评估 'Trondheim' or 'Hammer Dance',这又变成了 True or 'Hammer Dance'。由于前面提到的短路,因为左边的对象是 True,'Hammer Dance' 甚至没有被评估为 True,这就是 'Trondheim' 被 returned 的原因。

non_null 的赋值中,or 比较按顺序计算,转换为:

if string1:
    non_null = string1
elif string2:
    non_null = string2
elif string3:
    non_null = string3
else:
    non_null = False

但是,在您的示例中,string1 是一个空字符串,计算结果为 False(您可以通过在提示中键入 if not '':print("Empty") 来检查)。

由于 string2 不为空,因此计算为 True,因此将其分配给 non_null,因此得到结果。