为什么显式测试空集不起作用

时间:2015-10-31 14:40:11

标签: python python-3.x

如果空set()False,则以下代码中的if test == False子句不应该评估为True吗?

test = set() 

#  empty sets are false
if test == False:
    print("set is empty")
else:
    print("set NOT empty")

if not test:
    print("set is empty")

输出中:

set NOT empty
set is empty

3 个答案:

答案 0 :(得分:11)

简单来说,equals运算符==将在这两个对象之间执行相等比较:set和boolean值永远不会相等,因此比较结果为false。另一方面,只需检查if obj(或if not obj)将检查对象的真实性,可以为每个对象评估。在某种程度上,这实际上是使用if bool(obj)进行类型转换。对于空集,这是错误的。

data model中,这两个操作都会调用不同的特殊方法名称。使用相等运算符比较两个对象将调用__eq__,而在对象上调用bool()将调用__bool__

答案 1 :(得分:5)

运算符==将检查2个对象的值,在这种情况下,空set()和False值的值不相同。

由于python将任何空序列评估为False而没有空序列评估为True,如果要检查test对象的验证,则可以简单地使用if

if test:
  #do stuff
  

Truth Value Testing

     

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

     
      
  • 列出项目

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

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

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

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

  •   
     

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

答案 2 :(得分:2)

这里的关键点是,False不是唯一被认为是假的值。在条件中,空集也被解释为false。

但是,显式相等性测试test == False不正确,因为作为定义的空集类型为set,它永远不会等于布尔值 False

请参阅Boolean Operations

  

在布尔运算的上下文中,以及控制流语句使用表达式时,以下值被解释为false:FalseNone,所有类型的数字零和空字符串和容器(包括字符串,元组,列表,字典,集合和frozensets)。所有其他值都被解释为true。用户定义的对象可以通过提供__bool__()方法来自定义其真值。