直到 Python 3.5,文档仍然说(强调我的):4.1. 真值检验可以测试任何对象的真值,用于 if 或 while 条件或作为下面布尔运算的操作数。以下值被认为是错误的:NoneFalse任何数字类型的零,例如0, 0.0, 0j。任何空序列,例如'', (), []。任何空映射,例如{}.用户定义类的实例,如果该类定义了一个__bool__()或__len__()方法,当该方法返回整数零或bool 值时False。[1]所有其他值都被认为是真实的——所以许多类型的对象总是真实的。除非另有说明,否则具有布尔结果的操作和内置函数始终返回0or Falsefor false 和1or Truefor true。(重要的例外:布尔运算or总是and返回它们的操作数之一。)一个非空列表 like[5]不属于上面列表中的任何内容,因此“所有其他”指定它是真的。但从 Python 3.6 开始,它就消失了。该部分现在说:真值检验可以测试任何对象的真值,用于iforwhile 条件或作为下面布尔运算的操作数。默认情况下,一个对象被认为是真实的,除非它的类定义了一个返回零的__bool__()方法,当用该对象调用时。[1] 以下是大多数被认为是 false 的内置对象:False__len__()常量定义为假:None和False。任何数字类型的零:0, 0.0, 0j, Decimal(0),Fraction(0, 1)空序列和集合:'', (), [], {}, set(),range(0)除非另有说明,否则具有布尔结果的操作和内置函数始终返回0or Falsefor false 和1or Truefor true。(重要的例外:布尔运算or总是and返回它们的操作数之一。)Now[5]可能有一个__bool__()返回 的方法False,因此它是错误的。当前文档中是否有新的地方以某种方式指定非空列表为真?
3 回答
忽然笑
TA贡献1806条经验 获得超5个赞
所有内置类的文档都列出了它们实现的所有特殊方法。如果未列出某个方法,则可以假定它未实现。
由于 的文档list
没有说明重写该__bool__
方法,因此它继承了默认行为。
陪伴而非守候
TA贡献1757条经验 获得超8个赞
刚刚在参考资料中找到了一个地方(强调我的):
6.11. 布尔运算
[...]
在布尔运算的上下文中,以及当控制流语句使用表达式时,以下值被解释为假: , ,
False
所有None
类型的数字零,以及空字符串和容器(包括字符串、元组、列表、字典、集合和冷冻套装)。所有其他值都被解释为 true。 用户定义的对象可以通过提供__bool__()
方法来自定义它们的真值。
令我有点困扰的是,这与下一句有关用户定义对象的内容立即矛盾,但我会接受。
暮色呼如
TA贡献1853条经验 获得超9个赞
[5]
是一个list
对象。除非您专门覆盖了内置__bool__
方法,否则您将获得默认方法。正如文档已经暗示的那样,这是Truthy。
更新并没有改变太多,只是扩大了解释以涵盖派生类型和内置类型的其他扩充。
添加回答
举报
0/150
提交
取消