使用有什么积极的危害if False in [a, b, c, d]
吗?
它减少了代码的大小,并且可以在解释器中工作。但是这种情况会造成任何积极的伤害吗?
没有害处:
if False in [a, b, c, d]
它或多或少相当于:
for i in [a, b, c, d]:
if i == False:
return True
return False
但它只检查文字False
对象的存在。它不检查“虚假”的对象,即它们的行为类似于False
条件if
。其他虚假值的示例是空字符串、空列表或None
.
有关详细信息,请参阅文档:真值测试
如果您只想检查列表是否包含任何虚假元素,请改用:
if not all([a, b, c, d])
看起来像:
for i in [a, b, c, d]:
if not i:
return True
return False
这通常是你想要的。
不,这种情况通常不会造成任何伤害。
in
比较运算符不会改变任何东西。如果任何变量a
,或确实是or b
,则测试将成功,否则将失败(返回)。(临时)收集到列表中的四个变量本身不会受到影响。c
d
0
False
False
(为什么0
?因为bool
是 and 的子类,int
在False == 0
pythonTrue
中。所以False in [0]
也是True
。在你的解释器中尝试一下;issubclass(bool, int)
返回True
,然后尝试True + 1
更多惊喜)。
一个例外是,如果有人错误地__eq__
在自定义类上创建了一个相等挂钩,从而改变了实例的状态。这将是该自定义类中的一个大错误,而不是特定于in
语句本身的任何内容。
False in [0,0,0]
即使列表中没有实际值也返回 true False
(尽管正如评论者指出的那样0 == False
)。
如果您关心这类事情,则必须使用以下方法检查对象身份:
any(x is False for x in [a, b, c, d])