为了账号安全,请及时绑定邮箱和手机立即绑定

Python逻辑表达式中的奇怪转换

Python逻辑表达式中的奇怪转换

胡说叔叔 2021-03-22 10:19:54
我注意到Python 2.7逻辑表达式的一种奇怪行为:>>> 0和False0>>>错误和0错误的>>> 1和False错误的>>>错误和1错误的并用True代替False>>> 0和True0>>> True和00>>> 1和True真的>>> True和11个Python将逻辑语句转换为整数时,有任何规则吗?为什么有时显示0插入False和1插入True?更何况它为什么会返回这个?>>>“测试”或“测试”'测试'
查看完整描述

3 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

什么都没有被转换;Python布尔逻辑运算符反而会短路

请参阅布尔运算符文档:

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

表达式x or y首先求值x; 如果x为true,则返回其值;否则为false。否则,y将求值并返回结果值。

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

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

结合这两种行为意味着,对于0 and False,会0视为false并在评估False表达式之前返回。对于表达式True and 0True被求值并发现它是一个真值,因此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

为了使图片更完整,在布尔上下文中不被视为false的值将被视为true,包括任何自定义类。您可以通过在类上实现一个.__nonzero__()特殊的方法来更改它。如果未定义此类方法,.__len__()则也请参考。使用这两种方法中的任何一种,您都可以发出信号,表明您的类型是数字,并且True如果非零,则应考虑该类型;或者,它是一个容器,并且True如果不为空(长度超过0),则应考虑该类型。


查看完整回答
反对 回复 2021-03-23
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

那是因为0它本身就是虚假的价值。


>>> bool(0)

False


>>> bool(1)

True

0 and True0因为0是Falsy,AND条件一旦找到第一个falsy值便立即停止执行并返回该值。如果所有值均为True,则返回最右边的值。

OR将继续检查值,直到True找不到first为止,否则它将返回最后一个值。

来自docs

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

  • 没有

  • 错误的

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

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

  • 任何空映射,例如{}

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

所有其他值都被认为是真实的-因此许多类型的对象总是真实的。

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


查看完整回答
反对 回复 2021-03-23
  • 3 回答
  • 0 关注
  • 188 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号