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