每个列表理解都可以在普通的 if 语句中复制吗

Can every list comprehension be duplicated in a normal if statement

我想知道列表理解是否有任何特殊的评估顺序,使它们无法在普通的 if 语句中复制:

例如,是否可以在没有列表理解的情况下编写相同的内容?如果是这样,是否可以不使用 "else"?

a, b = set(), set()
[a.add(i) for i in range(5) if i % 2 == 0 or b.add(i)]

具体来说,我在这种情况下演示了 "or" 的惰性求值,但我不知道如何在列表理解之外演示它,因为在正常的 for 中使用 'if' 时循环,set.add() 是在布尔上下文而不是实际表达式 ( i % 2 == 0 ) 中计算的东西。

您的列表理解与:

for i in range(5):
    if i % 2 == 0 or b.add(i):
        a.add(i)

因此 if 语句与列表理解中的没有任何不同。

您的代码可以替换为:

for i in range(5):
    if i % 2 == 0:
        a.add(i)
    else:
        b.add(i)

从阅读的角度来看,我认为您之前的示例含糊不清。由于 b.add(i) 是就地完成的,它总是 return None(被解释为 False),所以它对条件没有任何作用。第二个代码片段更具可读性,因为它清楚您的意图。