为什么 "test" and "test" return "test" , 1 and 1 return 1 而不是 True?

Why does "test" and "test" return "test" , 1 and 1 return 1 instead of True?

为什么 "test" and "test" return "test" or 1 and 1 return 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

为什么它 return 既不是真也不是假?

引用 Python documentation,

The expression x and y first evaluates x; if x is false, its value is returned; otherwise, y is evaluated and the resulting value is returned.

The expression x or y first evaluates x; if x is true, its value is returned; otherwise, y is evaluated and the resulting value is returned.

(Note that neither and nor or restrict the value and type they return to False and True, but rather return the last evaluated argument. This is sometimes useful, e.g., if s is a string that should be replaced by a default value if it is empty, the expression s or 'foo' yields the desired value. Because not has to invent a value anyway, it does not bother to return a value of the same type as its argument, so e.g., not 'foo' yields False, not ''.)

如文档中所述,如果第一个表达式在 x and y 中为 Falsy,无论表达式 y 的值是多少,它都会被返回,类似地,如果表达式 [=12] =] 为真则返回表达式 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" 的情况下,由于空字符串是假的,and 不需要检查第二个表达式。

"" or "test2"中,由于空字符串是假的,or计算下一个表达式,returns作为结果。因此,test2.

"test1" and "test2"中,因为test1是Truthy,or不需要计算第二个表达式和returns test1.

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)

所以它 returns 要么 x 要么 y 而不是 TrueFalsenot 除外)。

a or ba and b 的计算方式分别类似于 a if a else bb if a else a

乍一看这似乎很奇怪,但如果结果被解释为布尔值,它的语义与您对 andor 的预期是一致的。如果你需要结果是一个布尔值,你可以做b = bool(x or y)。当您在条件(ifwhile 等)中使用 orand 时,则不需要。

而且,它非常好用。例如,您可以使用 or 运算符来提供默认值。例如,x = y or "default" 会将 y 的值赋给 x,如果 yNone(或任何其他值评估为 False 作为布尔值,如空列表、空字符串等)

至于问题,为什么是这样的:我想你得问Python的设计者了。

规则是它 returns 它检查真实性的最后一个值。 andor 的短路行为意味着该值将始终与整个表达式具有相同的真实性。它没有被强制为 bool 的原因主要是因为它不需要 - 而且当前的行为偶尔有用。例如,您可以像这样计算任意数字的数字和:

 def digitsum(num):
    return num % 9 or 9

相当于,但可以说比:

更优雅
 def digitsum(num):
    mod = num % 9
    return mod if mod else 9

在 python 增长条件表达式之前,偶尔会使用一个更复杂的版本作为三元运算符。

一个 and 链 returns 等于 False 的第一个值或最后一个值,如果它们中的 none 等于 False:

a and b and c ... and z

returns:

a 如果 == 假

b 如果 a == True 且 b == False

c 如果 a == True 且 b == True 且 c == False

...

z 如果所有先前的值都是 True