为什么"测试"和"测试"返回"测试" ,1和1返回1而不是True?

时间:2015-01-15 11:31:07

标签: python boolean-logic boolean-expression

为什么“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?

5 个答案:

答案 0 :(得分:4)

引用Python documentation

  

表达式x and y首先评估x;如果x为false,则返回其值;否则,将评估y并返回结果值。

     

表达式x or y首先评估x;如果x为真,则返回其值;否则,将评估y并返回结果值。

     

(请注意,andor都不会限制返回FalseTrue的值和类型,而是返回上次评估的参数。< / 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)

因此,它必须返回xy而不是TrueFalsenot除外)。

答案 2 :(得分:1)

规则是它返回检查其真实性的最后一个值。 andor的短路行为意味着该值始终与整个表达式具有相同的真实性。它没有被强制推销的原因很大程度上是因为它不需要 - 而且目前的行为偶尔会有用。例如,您可以计算任何数字的数字总和,如下所示:

 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 ba and b的评估分别为a if a else bb if a else a

这一开始可能看起来很奇怪,但如果结果被解释为布尔值,那么它的语义与andor所期望的一致。如果您需要将结果作为布尔值,则可以执行b = bool(x or y)。在条件(orand等)中使用ifwhile时,不需要这样做。

此外,它非常方便。例如,您可以使用or运算符来提供默认值。例如,如果x = y or "default"x(或任何其他值,则y会将"default"的值分配给yNone评估为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