这是正常行为吗?
answer=all(c=='false True answer?' for c in [])
# answer = True
如果我想在空列表中使用“all”检查值时使用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'])
答案 0 :(得分:3)
In [2]: all([])
Out[2]: True
是
c == '...'
永远不会被评估,因为for c in []
不承认任何项目。当[]
中的iterable
为空时,列表理解会立即评估为for c in iterable
。
答案 1 :(得分:3)
您正在检查空列表的所有元素是否等于某个值。由于列表中没有值,因此技术上所有值 都等于其他值。
>>> all([])
True
如果任何表达式评估为all
,则 False
会返回False
,否则会返回True
。因为没有条件不正确(因为首先没有条件),all
会返回True
。
答案 2 :(得分:2)
如果iterable的所有元素都为真(或者如果是),则返回True iterable是空的。)
您的生成器表达式c=='false True answer?' for c in []
为空,因为它遍历空列表。比较永远不会发生,因为没有in []
。
答案 3 :(得分:1)
all
始终评估为True
。所以,是的,这是正常的。