我以为我在Python中理解了这两个单例值,直到我看到有人在代码中使用return l1 or l2
,其中l1和l2都是链表对象,并且如果它不是None,他想返回l1,否则返回l2。
这段代码很好,因为它很短,似乎很容易理解。然后,我写了一些代码来弄清楚这里有什么。
print ( True or 'arbitrary' ) #True
print ( False or 'arbitrary') #arbitrary
print ( None or 'arbitrary' ) #arbitrary
印刷结果如预期。但是,当我试图将None
和False
放在一起时。发生了一件非常奇怪的事。
print ( False or None ) #None
print ( None or False ) #False
print ( None or False or True) #True
所以,我猜return A or B
的规则是:
最后,我运行此代码来验证我的猜测。
print ( None or False or True or None) # True
print ( None or False or None) # None
print ( False or None or False) # False
结果似乎证明了我的理论。但是有人有更多解释吗?
另外,当我使用and
时,我得到了一些有趣的东西。为什么?
print ( None and False) #None
print ( False and None) #False
简短的回答是'和'返回第一个假值或最后一个真值,'或'返回第一个真假或最后一个假答案。
>>> None or False
False
>>> False or None
>>> False and None
False
>>> None and False
...
>>> 0 or 3 or 4
3
>>> 5 and 0 and 6
0
>>> 5 and 0 or 6
6
>>> False or {} or 0
0
>>> 3 and 4 and 5
5
在python中,空字符串,set,list,dictionary,其他容器或0都等于逻辑操作的False。非空集合和非零数字在逻辑上是真的。
对于'或',如果先前未遇到逻辑上的True表达式,则将返回最后一个表达式。该表达式将通过上述规则进行逻辑评估。
无需猜测。对于or
,Python的Reference Manual说
“表达式x or y
首先评估x
;如果x
为真,则返回其值;否则,将评估y
并返回结果值。”
换句话说,x if x else y
,其中x
只评估一次,y
只在需要时评估。
对于and
,将“true”更改为“false”。
表达式x and y
首先评估x
;如果x
为假,则返回其值;否则,将评估y
并返回结果值。
换句话说,x if not x else y
,其中x
只评估一次,y
只在需要时评估。