如果空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
答案 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
可以测试任何对象的真值,用于if或while条件或下面布尔运算的操作数。以下值被视为false:
列出项目
无
假
任何数字类型的零,例如0,0.0,0j。
任何空序列,例如'',(),[]。
任何空映射,例如{}。
用户定义类的实例,如果类定义了
__bool__()
或__len__()
方法,则该方法返回整数零或bool值为False。所有其他值都被认为是真的 - 因此许多类型的对象始终为真。
答案 2 :(得分:2)
这里的关键点是,False
不是唯一被认为是假的值。在条件中,空集也被解释为false。
但是,显式相等性测试test == False
不正确,因为作为定义的空集类型为set
,它永远不会等于布尔值
False
。
在布尔运算的上下文中,以及控制流语句使用表达式时,以下值被解释为false:
False
,None
,所有类型的数字零和空字符串和容器(包括字符串,元组,列表,字典,集合和frozensets)。所有其他值都被解释为true。用户定义的对象可以通过提供__bool__()
方法来自定义其真值。