1

这是正常行为吗?

answer=all(c=='false True answer?' for c in [])
# answer = True

如果我希望空列表中的“全部”检查值 False 以使用这样的行,可以吗?:

answer=all(set([c=='a' for c in []]) or [False,])

如果:

answer=all(set([c=='a' for c in ['a','a']]) or [False,])
answer=all(set([c=='a' for c in ['a','b']]) or [False,])

我决定使用反向逻辑,例如:

bad_answer=bool([c for c in ['a','b'] if c!='a'])
4

4 回答 4

3
In [2]: all([])
Out[2]: True

是的。

c == '...'永远不会被评估,因为不for c in []承认任何项目。当in为空时,列表推导[]立即计算为。iterablefor c in iterable

于 2013-03-18T10:51:14.703 回答
3

您正在检查空列表的所有元素是否都等于某个值。因为列表中没有值,所以从技术上讲,所有值等于另一个值。

>>> all([])
True

allFalse如果任何表达式的计算结果为 ,则返回FalseTrue否则返回。因为没有一个条件不成立(因为首先没有条件),所以all返回True.

于 2013-03-18T10:51:23.630 回答
2

all()记录

如果可迭代对象的所有元素都为真(或可迭代对象为空),则返回 True。

您的生成器表达式c=='false True answer?' for c in []为空,因为它遍历一个空列表。比较永远不会发生,因为什么都没有in []

于 2013-03-18T10:52:40.990 回答
1

allTrue在对空序列进行操作时,总是评估为。所以是的,这很正常。

于 2013-03-18T10:52:12.127 回答