6

我注意到 Python 2.7 逻辑表达式的一个奇怪行为:

>>> 0 和假
0
>>> 假和 0
错误的
>>> 1 和错误
错误的
>>> 假和 1
错误的

并用 True 代替 False

>>> 0 和真
0
>>> 真和 0
0
>>> 1 和真
真的
>>> 真和 1
1

Python将逻辑语句转换为整数时有什么规则吗?为什么有时会显示 0 insted of False 和 1 insted of True?

更何况,它为什么会返回这个?

>>>“测试”或“测试”
'测试'
4

3 回答 3

8

没有任何东西被转换;Python 布尔逻辑运算符改为short circuit

请参阅布尔运算符文档

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

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

此外,等于 的数字0被认为是错误的,空字符串和容器也是如此。引用同一文件:

在布尔运算的上下文中,以及当控制流语句使用表达式时,以下值被解释为 false:False, None, 所有类型的数字零,以及空字符串和容器(包括字符串、元组、列表、字典、集合和冻结集)。

结合这两种行为意味着对于0 and False0认为是假的,并在评估False表达式之前返回。对于表达式True and 0,True被评估并发现是一个真值,所以0返回。就ifandwhile和其他布尔运算符而言,该结果0也被认为是错误的。

您可以使用它来提供默认值,例如:

foo = bar or 'default'

要将非布尔值真正转换为布尔值,请使用bool()type ; 它使用与布尔表达式相同的规则来确定输入的布尔值:

>>> bool(0)
False
>>> bool(0.0)
False
>>> bool([])
False
>>> bool(True and 0)
False
>>> bool(1)
True

为了完成图片,在布尔上下文中不被认为是假的值被认为是真,包括任何自定义类。你可以通过在你的类上实现一个.__nonzero__()特殊的方法来改变它。如果没有定义这样的方法,.__len__()也请参考。使用这两种方法中的任何一种,您都可以表明您的类型是数字的,True如果非零则应被考虑,或者它是一个容器,True如果不为空(长度超过 0)则应被考虑。

于 2013-05-11T11:24:20.853 回答
4

Python 总是返回一个操作数对象

and返回第一个“假”对象或最后一个“真”对象。

or返回第一个“真”对象或最后一个“假”对象。

请注意,所有0, 0.0, False,""都被视为“假”。

>>> "a" and "b" and "c"
'c'
>>> "a" or "b" or "c"
'a'
于 2013-05-11T11:24:00.960 回答
2

那是因为0is s 虚假值本身。

>>> bool(0)
False

>>> bool(1)
True

0 and True0因为0ANDFalsy ,一旦找到第一个 falsy 值并返回该值,条件就会停止执行。如果所有值都为 True,则返回最右边的值。

OR将继续检查值,直到True找不到第一个值,否则它返回最后一个值。(最右边)

来自docs

可以测试任何对象的真值,用于 if 或 while 条件或作为以下布尔运算的操作数。以下值被认为是错误的:

  • 没有任何

  • 错误的

  • 任何数字类型的零,例如0, 0L, 0.0, 0j.

  • 任何空序列,例如'', (), [].

  • 任何空映射,例如{}.

  • 用户定义类的实例,如果该类定义了一个 __nonzero__()__len__()方法,当该方法返回整数零或布尔值 False。

所有其他值都被认为是真的——所以许多类型的对象总是真的。

除非另有说明,否则具有布尔结果的操作和内置函数始终返回 0 或 False 表示假,1 或 True 表示真。(重要的例外:布尔运算 or 和 and 总是返回它们的操作数之一。)

于 2013-05-11T11:22:59.607 回答