【发布时间】:2019-11-24 11:37:59
【问题描述】:
我只是在 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 个值了。
那么,为什么会发生这种情况呢?我敢肯定我遗漏了很多细节。
【问题讨论】:
-
你用的是什么版本的 Python?
-
只是为了详细说明正确答案:发电机排气。当所有值都生成后,它将不再生成。那么,使用相同的生成器两次,一开始就不会像您预期的那样工作。
-
这其实是一个很好的问题。我从来没有想过这一点,现在我已经通过一些测试来理解这一点!
标签: python python-3.x generator-expression