在python中,布尔运算符如何处理字符串

在python中,布尔运算符如何处理字符串,python,Python,结果=>“asdf” 结果=>“qwer” 我不明白这些东西是怎么工作的。我原以为字符串上的布尔运算符会导致类型错误,但事实并非如此。它是否类似于预定义语句,例如“a if b else c” 和和或的工作原理与常见的布尔运算符类似——如果两个操作数都为真,则返回true;如果其中一个操作数为真,则返回false 它们也会短路,就像&和|一样 然而,在Python中,在布尔上下文中任何东西都可以被解释为True或False,还有一个事实——当它有足够的信息停止求值时,它将返回在布尔上下文中求值为

结果=>“asdf”

结果=>“qwer”


我不明白这些东西是怎么工作的。我原以为字符串上的布尔运算符会导致类型错误,但事实并非如此。它是否类似于预定义语句,例如“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