为什么“test”和“test”返回“test”或1和1返回1而不是True?
>>> 'test' and True
True
>>> True and 1
1
>>> 0 and True
0
>>> 0 and False
0
>>> 'test' and True
True
>>> 'test' and False
False
>>> 0 and True
0
>>> 0 and False
0
>>> 1 and True
True
>>> 1 and False
False
>>> [2,3] and True
True
>>> [2,3] and False
False
为什么不返回True或False?
答案 0 :(得分:4)
表达式
x and y
首先评估x
;如果x
为false,则返回其值;否则,将评估y
并返回结果值。表达式
x or y
首先评估x
;如果x
为真,则返回其值;否则,将评估y
并返回结果值。(请注意,
and
和or
都不会限制返回False
和True
的值和类型,而是返回上次评估的参数。< / strong>这有时很有用,例如,如果s
是一个应该被默认值替换的字符串(如果它为空),则表达式s or 'foo'
会产生所需的值。因为not
不管怎样,它必须发明一个值,它并不打算返回与其参数相同类型的值,例如,not 'foo'
产生False,而不是''
。)
如文档中所述,如果x and y
中的第一个表达式为Falsy,则无论表达式y
的值是什么,都会返回它,类似于表达式x
是真实的,然后返回表达式x
的结果。
这就是"test" and "test"
为您提供test
的原因。试试这个,
>>> "test1" and "test2"
'test2'
>>> "" and "test2"
''
>>> "" or "test2"
'test2'
>>> "test1" or "test2"
'test1'
在"test1" and "test2"
案例中,test1
被评估,结果证明是Truthy。因此,还必须评估第二个表达式,并将该评估的结果返回为test2
。
在"" and "test2"
的情况下,由于空字符串是Falsy,and
不需要检查第二个表达式。
在"" or "test2"
中,由于空字符串是Falsy,or
会计算下一个表达式并将其作为结果返回。因此,test2
。
在"test1" and "test2"
中,由于test1
是Truthy,or
无需评估第二个表达式并返回test1
。
答案 1 :(得分:2)
According to the documentation:
x or y if x is False, then y, else x (1)
x and y if x is False, then x, else y (2)
not x if x is False, then True, else False (3)
因此,它必须返回x
或y
而不是True
或False
(not
除外)。
答案 2 :(得分:1)
规则是它返回检查其真实性的最后一个值。 and
和or
的短路行为意味着该值始终与整个表达式具有相同的真实性。它没有被强制推销的原因很大程度上是因为它不需要 - 而且目前的行为偶尔会有用。例如,您可以计算任何数字的数字总和,如下所示:
def digitsum(num):
return num % 9 or 9
这相当于,但可以说比以下更优雅:
def digitsum(num):
mod = num % 9
return mod if mod else 9
在python增长条件表达式之前,有时会使用更精细的版本作为三元运算符。
答案 3 :(得分:0)
a or b
和a and b
的评估分别为a if a else b
和b if a else a
。
这一开始可能看起来很奇怪,但如果结果被解释为布尔值,那么它的语义与and
和or
所期望的一致。如果您需要将结果作为布尔值,则可以执行b = bool(x or y)
。在条件(or
,and
等)中使用if
或while
时,不需要这样做。
此外,它非常方便。例如,您可以使用or
运算符来提供默认值。例如,如果x = y or "default"
为x
(或任何其他值,则y
会将"default"
的值分配给y
或None
评估为False
作为布尔值,如空列表,空字符串等。)
至于问题,为什么就是这样:我猜你不得不问问Python的设计师。
答案 4 :(得分:0)
and
链返回第一个值,该值等于False或最后一个值,如果它们都不等于False:
a and b and c ... and z
返回:
a
如果a == False
b
如果a == True且b == False
c
如果a == True且b == True且c == False
...
z
如果之前的所有值均为True