“如果在[a,b,c,d]中为假,则任何有效的伤害”

时间:2012-11-22 10:09:39

标签: python

使用if False in [a, b, c, d]时是否有任何正面伤害?

它减少了代码的大小,并且它在解释器中起作用。但是这种情况会导致任何积极的伤害吗?

3 个答案:

答案 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比较运算符不会改变任何内容。如果任何变量abcd确实是0False,则测试会成功,否则会失败(返回False)。收集(临时)到列表中的四个变量本身不会受到影响。

(为什么0?因为boolint的子类,而False == 0True,所以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])