使用有什么积极的危害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,则测试将成功,否则将失败(返回)。(临时)收集到列表中的四个变量本身不会受到影响。cd0FalseFalse
(为什么0?因为bool是 and 的子类,int在False == 0pythonTrue中。所以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])