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

Age*_*ote 10 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")
Run Code Online (Sandbox Code Playgroud)

输出继电器:

set NOT empty
set is empty
Run Code Online (Sandbox Code Playgroud)

pok*_*oke 11

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

数据模型中,这两个操作都会调用不同的特殊方法名称.使用相等运算符比较两个对象将调用,__eq__同时调用bool()对象将调用__bool__.


Kas*_*mvd 5

操作员==将检查2对象的值,在这种情况下,空set()值和假值没有相同的值.

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

if test:
  #do stuff
Run Code Online (Sandbox Code Playgroud)

真值测试

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

  • 项目清单

  • 没有

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

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

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

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

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