为什么我在 python 中尝试的以下逻辑操作的输出不同?
-1 or 1
1 or -1
第一次退货-1
和第二次退货1
and
并且or
都很懒惰;他们评估操作数,直到他们可以决定结果(and
在第一个操作数处停止False
;or
在第一个True
操作数处停止)。它们返回评估的最后一个操作数,如文档中所述:
请注意,既不限制
and
也不or
限制它们返回的值和类型False
,True
而是返回最后评估的参数。这有时很有用,例如,如果s
字符串为空,则应将其替换为默认值,则表达式会s or 'foo'
产生所需的值。
阅读文档:
表达式
x or y
首先计算x
; 如果x
为真,则返回其值;否则,y
评估并返回结果值。
第一部分-1
和1
都被评估True
并因此返回。第二部分被忽略。
or
操作员短路。它返回True
布尔上下文中的第一个值,否则返回最后一个计算的表达式。-1
并且1
都True
在布尔上下文中,所以你得到第一个数字。
0
,None
并且所有空容器评估为False
。
例如:
>>> 0 or 5
5
>>> '' or []
[]
如果or
第一个条件为真,则不评估第二个条件,
我认为 OP 期望“或”的返回值是 True 或 False(就像其他一些语言中的布尔运算符一样。)
Python 和 Perl 一样,只返回第一个“真”值(其中“真”表示数字非零,字符串非空,非无等)
类似地,当且仅当两者都为“真”时,'and' 返回最后一个值。
他可能会对类似的结果感到更加惊讶
{'x':1} or [1,2,3]
Perl 程序员经常习惯性地使用这种结构(如open(FILE, "foo.txt") || die
; 我不知道这在 Python 中是否常见。
(见人)