Python 生成器表达式和任意/全部的意外结果

Python 生成器表达式和任意/全部的意外结果,python,generator,any,Python,Generator,Any,我在计算生成器表达式时遇到了一个奇怪的问题 我的代码有一个测试一些条件的生成器表达式。让我们称之为“gen_ex”。如果我将其转换为列表以查看输出: print(list(gen_ex)) 我明白了: [False, False, False, False, True, True, False, False, False] 但是,当我对其使用any()和all()时,会得到意想不到的结果 any(gen_ex) 返回False,而: all(gen_ex) 返回True 这应该是预期的行

我在计算生成器表达式时遇到了一个奇怪的问题

我的代码有一个测试一些条件的生成器表达式。让我们称之为“gen_ex”。如果我将其转换为列表以查看输出:

print(list(gen_ex))
我明白了:

[False, False, False, False, True, True, False, False, False]
但是,当我对其使用any()和all()时,会得到意想不到的结果

any(gen_ex)
返回False,而:

all(gen_ex)
返回True


这应该是预期的行为吗?还是幕后发生了奇怪的事情?

生成器不能多次迭代。第一次调用
list
将使用所有值

>>> gen_ex = (x for x in (1,2,3))
>>> list(gen_ex)
[1,2,3]
>>> list(gen_ex)
[]
同样地,
any
all
也看到了一个空的值序列。您看到的返回值是基本情况:

  • any([])
    False
    ,因为列表中没有True元素(即参数中的元素计算结果为
    True
  • all([])
    True
    ,因为列表中没有假元素(即,列表中的每个元素都是
    True
    ,因为没有元素)

创建列表会使发电机排气;
any
all
都没有看到任何要测试的值,因此分别对
False
True
进行真空评估。。。。你就这么做了吗?因为如果执行
list(gen_ex)
操作,则生成器将被消耗,并且在消耗之后始终为空,因此,
any
将始终返回false,
all
true将始终在空的iterables上返回true。。。请始终发布一个帖子,以便我们能够真实地复制您正在做的事情,并避免这种不必要的猜测