我只是在 Python 解释器中乱搞,遇到了一些意想不到的行为。
>>> bools = (True, True, True, False)
>>> all(bools)
False
>>> any(bools)
True
好吧,到目前为止没有任何异常...
>>> bools = (b for b in (True, True, True, False))
>>> all(bools)
False
>>> any(bools)
False
这就是事情开始变得怪异的地方。我认为这是因为all函数迭代生成器表达式,调用它的__next__方法并用完这些值,直到遇到False. 以下是支持该理论的一些证据:
>>> bools = (b for b in (True, False, True, True))
>>> all(bools)
False
>>> any(bools)
True
我认为结果是不同的,因为False不在末尾,所以生成器中仍然有一些未使用的值。如果你输入
>>> bools = (b for b in (True, False, True, True))
>>> all(bools)
False
>>> list(bools)
[True, True]
似乎只有 2 个剩余值。
那么,为什么这真的会发生呢?我敢肯定有很多我遗漏的细节。