4

使用有什么积极的危害if False in [a, b, c, d]吗?

它减少了代码的大小,并且可以在解释器中工作。但是这种情况会造成任何积极的伤害吗?

4

3 回答 3

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。其他虚假值的示例是空字符串、空列表或None.

有关详细信息,请参阅文档:真值测试

如果您只想检查列表是否包含任何虚假元素,请改用:

if not all([a, b, c, d])

看起来像:

for i in [a, b, c, d]:
    if not i:
        return True
return False

这通常是你想要的。

于 2012-11-22T10:20:06.183 回答
3

不,这种情况通常不会造成任何伤害。

in比较运算符不会改变任何东西。如果任何变量a,或确实是or b,则测试将成功,否则将失败(返回)。(临时)收集到列表中的四个变量本身不会受到影响。cd0FalseFalse

(为什么0?因为bool是 and 的子类,intFalse == 0pythonTrue中。所以False in [0]也是True。在你的解释器中尝试一下;issubclass(bool, int)返回True,然后尝试True + 1更多惊喜)。

一个例外是,如果有人错误地__eq__在自定义类上创建了一个相等挂钩,从而改变了实例的状态。这将是该自定义类中的一个大错误,而不是特定于in语句本身的任何内容。

于 2012-11-22T10:10:34.953 回答
2

False in [0,0,0]即使列表中没有实际值也返回 true False(尽管正如评论者指出的那样0 == False)。

如果您关心这类事情,则必须使用以下方法检查对象身份:

any(x is False for x in [a, b, c, d])
于 2012-11-22T10:18:22.420 回答