在python中,布尔运算符如何处理字符串
结果=>“asdf” 结果=>“qwer”在python中,布尔运算符如何处理字符串,python,Python,结果=>“asdf” 结果=>“qwer” 我不明白这些东西是怎么工作的。我原以为字符串上的布尔运算符会导致类型错误,但事实并非如此。它是否类似于预定义语句,例如“a if b else c” 和和或的工作原理与常见的布尔运算符类似——如果两个操作数都为真,则返回true;如果其中一个操作数为真,则返回false 它们也会短路,就像&和|一样 然而,在Python中,在布尔上下文中任何东西都可以被解释为True或False,还有一个事实——当它有足够的信息停止求值时,它将返回在布尔上下文中求值为
我不明白这些东西是怎么工作的。我原以为字符串上的布尔运算符会导致类型错误,但事实并非如此。它是否类似于预定义语句,例如“a if b else c”
和
和或
的工作原理与常见的布尔运算符类似——如果两个操作数都为真,则返回true;如果其中一个操作数为真,则返回false
它们也会短路,就像&
和|
一样
然而,在Python中,在布尔上下文中任何东西都可以被解释为True
或False
,还有一个事实——当它有足够的信息停止求值时,它将返回在布尔上下文中求值为True
或求值为False
的第一个操作数。(这与构造并返回一个实数布尔值True
或False
相反)这是可以做到的,因为如果它是布尔值,它将计算为如果不是因为这个事实,它将返回的布尔值
因此(请注意,”
在布尔上下文中计算为False
):
python中的对象被视为True或False(如“”,无) 布尔结果的结果依赖于可以确定结果的最后一个值 打印“aa”和“True” 真的 “aa”为真,但它无法确定结果,因此结果变为真 当 “aa” 但运算符or与运算符and不同,请参见
print True and 'aa'
没有
第一个“无”被认为是错误的,它可以决定最后的结果,
所以它打印“无”
当
“bb”
因为第一个错误不能决定最终结果 Python and or操作在确定答案时停止,并返回最后扫描的对象的值。它们不会返回真或假。我喜欢这个功能,发现自己一直在使用它
因为非空字符串计为True
print False or 'bb'
当它点击or时停止计算,因为答案现在已确定(or值之一为true),并返回最后检查的内容(“asdf”)。甚至不再检查其他操作数
另一方面,当
True and "asdf" or absolutely_anything_here_or_following
点击or,它还不知道anwser,因此继续下一个操作数。只要这里的“anything”是最后一个操作,就会确定答案并返回最后扫描的内容。在Python条件运算符之前:
False and "asdf" or absolutely_anything_here
过去有“货物代码”作为基于索引元组的变通方法:
>>> age=20
>>> 'legal' if age>=21 else 'not legal'
'not legal'
您可以分解发布的两个备选方案,以查看引擎盖下发生的情况:
>>> ('not legal','legal')[age>=21]
'not legal'
>>> age=22
>>> ('not legal','legal')[age>=21]
'legal'
您可以看到您看到的值弹出到您看到的值。您还可以查看的短路行为,并查看这是记录的行为 第一个示例 Python从左到右扫描和计算 在您的第一个示例中
True和“asdf”或“qwer”
评估为
“asdf”或“qwer”
由于非空字符串为True,Python会短路(忽略第二个操作数)并返回第一个操作数“asdf”
。记住True或x
将返回True
,而不管x
的值如何
第二个示例
False和“asdf”或“qwer”
这评估为
False或“qwer”
这次我们没有对第一个操作数短路(我们还没有足够的信息),Python需要检查第二个操作数
qwer
,它在布尔上下文中的计算结果为True
(记住它不是空的),并返回它。运算符的操作顺序:
--不首先进行评估;
--然后进行评价;
--或者是最后一次评估。
根据您的问题,首先计算“and”运算符,因为非空字符串计为True。因此,“asdf”变为真,而“qwer”也变为真。所以结果变成了“asdf”
在第二个错误中,“asdf”变为错误,“qwer”变为错误。因此,它是假的,因此它返回它最后一次检查“qwer”的内容。此问题有高质量的答案,包括已接受的答案。如果你想回答这样一个老问题,你应该尝试提供更多的信息或质量
True and "asdf" or absolutely_anything_here_or_following
False and "asdf" or absolutely_anything_here
>>> age=20
>>> 'legal' if age>=21 else 'not legal'
'not legal'
>>> ('not legal','legal')[age>=21]
'not legal'
>>> age=22
>>> ('not legal','legal')[age>=21]
'legal'
>>> import dis
>>> def f():
... x=True and "asdf" or "qwer"
... y=False and "asdf" or "qwer"
...
>>> dis.dis(f)
2 0 LOAD_GLOBAL 0 (True)
3 POP_JUMP_IF_FALSE 12
6 LOAD_CONST 1 ('asdf')
9 JUMP_IF_TRUE_OR_POP 15
>> 12 LOAD_CONST 2 ('qwer')
>> 15 STORE_FAST 0 (x)
3 18 LOAD_GLOBAL 1 (False)
21 POP_JUMP_IF_FALSE 30
24 LOAD_CONST 1 ('asdf')
27 JUMP_IF_TRUE_OR_POP 33
>> 30 LOAD_CONST 2 ('qwer')
>> 33 STORE_FAST 1 (y)
36 LOAD_CONST 0 (None)
39 RETURN_VALUE