True and "asdf" or "qwer"
result => “ASDF”
False and "asdf" or "qwer"
result => “QWER”
我无法理解这些事情是如何运作的。我认为字符串上的布尔运算符会使类型错误,但它没有。它是否类似于预定义语句,例如“a if b else c”?
答案 0 :(得分:4)
Python 和以及或操作在确定答案时停止,并返回扫描的最后一个对象的值。他们不会返回 True 或 False 。我喜欢这个功能,发现自己一直在使用它。
由于非空字符串计为True
True and "asdf" or absolutely_anything_here_or_following
当它到达或时停止计算,因为现在确定了答案(其中一个或值为true),并返回它检查的最后一个东西(“asdf “)。甚至没有检查过其他操作数。
另一方面,
时False and "asdf" or absolutely_anything_here
点击或,它不知道anwser,所以继续下一个操作数。只要absolute_anything_here是最后一个操作,就会确定答案并返回最后扫描的内容。
答案 1 :(得分:3)
and
和or
就像熟悉的布尔运算符一样 - 如果两个操作数都为真,则返回true,如果其操作数之一为真,则返回false。
它们也会短路,就像&&
和||
一样。
但是,在Python中,在布尔上下文中可以将任何内容解释为True
或False
,还有一个额外的事实 - 它将返回第一个计算为{{1}的操作数当有足够的信息来停止评估时,或者在布尔上下文中对True
求值。 (这与构造和返回一个真正的布尔值False
或True
相反。)这样做是可以的,因为如果它是布尔值,它将评估它将返回的布尔值,如果不是这样的话事实。
因此(注意False
在布尔上下文中被评估为""
:
False
答案 2 :(得分:2)
在Python条件运算符之前:
>>> 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
您可以看到您看到的值弹出您所看到的值。您还可以查看boolean operators的短路行为,并查看这是记录的行为。
答案 3 :(得分:0)
python中的对象被视为True的False(例如,'',None)
布尔结果的结果依赖于可以确定结果的最后一个值。
打印'aa'和True
真
'aa'为True,但无法确定结果,因此结果转为True
,而
print True and 'aa'
'AA'
但是运营商或与运营商不同,请参阅
print None and True
无
第一个None被认为是False,它可以确定最后的结果, 所以打印'无'
,而
print False or 'bb'
'BB'
因为第一个False无法确定最终结果!
答案 4 :(得分:0)
第一个例子
Python从左到右扫描和评估。
在你的第一个例子中
True and "asdf" or "qwer"
评估为
"asdf" or "qwer"
因为非空字符串为True,所以Python短路(忽略第二个操作数)并返回第一个操作数"asdf"
。请注意,无论True or x
的值是什么,True
都会返回x
。
第二个例子
False and "asdf" or "qwer"
这评估为
False or "qwer"
这次我们不会在第一个操作数上短路(我们还没有足够的信息),而Python需要检查第二个操作数qwer
,它在{1}中计算为True
布尔上下文(记住它不是空的),并返回它。
答案 5 :(得分:0)
运营商的运营顺序: - 首先评估; - 接下来评估; - 或最后评估。 根据您的问题,首先评估“和”运算符,因为非空字符串计为True。因此True和“asdf”变为True而不是True或“qwer”也变为true。结果变成“asdf” 在第二个False和“asdf”变为false和false并且“qwer”变为false。因此它是假的,所以它返回最后检查“qwer”的东西。