在Python3教程中,声明"可以将比较结果或其他布尔表达式分配给变量。"给出的例子是:
>>> string1, string2, string3 = '', 'Trondheim', 'Hammer Dance'
>>> non_null = string1 or string2 or string3
>>> non_null
'Trondheim'
'或者'到底是什么?比较字符串时运算符吗?为什么'特隆赫姆'选择?
答案 0 :(得分:2)
包含or
选择第一个非虚假字符串(从左到右检查),在本例中为'Trondheim'
>>> bool('')
False
>>> bool('Trondheim')
True
有时候,对strip
执行此类检查时,如果您打算不选择空格,那么字符串文字作为空格也很简洁。
>>> bool(' ')
True
答案 1 :(得分:1)
or
如果为真,则返回左侧的值,否则返回右侧的值。
对于字符串,只有""
(空字符串)不是true-ish,而其他所有字符串都是。
所以
>>> "" or "Test"
"Test"
和
>>> "One" or "Two"
"One"
根本没有进行比较。
答案 2 :(得分:1)
当被视为布尔值时,空字符串将返回False
,非空字符串将返回True
。
由于Python支持短路,因此在a or b
表达式中,如果b
为True,则不会评估a
。
在您的示例中,我们有'' or 'Trondheim' or 'Hammer Dance'
。
此表达式从左到右进行评估,因此评估的第一件事是'' or 'Trondheim'
,换句话说False or True
,它返回True
。接下来,Python尝试评估'Trondheim' or 'Hammer Dance'
,而True or 'Hammer Dance'
又变为'Hammer Dance'
。由于前面提到的短路,因为左对象为True,True
甚至不会被评估为'Trondheim'
,这就是返回 <tr id="enum-tr" data-toggle="collapse">
的原因。
答案 3 :(得分:1)
在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
,因此会产生结果。