Issue 25261: Incorrect Return Values for any() and all() Built-in Functions (original) (raw)

The results displayed by the any() and all() is incorrect (differs from what is documented and what makes sense).

Here is the code:

multiples_of_6 = (not (i % 6) for i in range(1, 10))

print("List: ", list(multiples_of_6 ), "\nAny: ", any(multiples_of_6), "\nAll: ", all(multiples_of_6))

The distribution in use is: Python 3.5.0 (v3.5.0:374f501f4567, Sep 13 2015, 02:27:37) [MSC v.1900 64 bit (AMD64)] on win32

Here is the output on Windows7:

List: [False, False, False, False, False, True, False, False, False] Any: False <<<<< This should be True All: True <<<<< This should be False

Not a bug. You have used a generator expression, so it is exhausted once you have run over it once using list(). Then, you run over it again with any() and all(), but they don't see any values so return the default value.

Change the generator expression to a list comprehension [ ... ] and you will get the results you want.

You wholly consume the iterator after the first time you apply list() to it. Therefore both any() and all() see an empty iterator, and return the results appropriate for an empty sequence:

multiples_of_6 = (not (i % 6) for i in range(1, 10)) list(multiples_of_6) [False, False, False, False, False, True, False, False, False] list(multiples_of_6) # note: the iterator is exhausted! [] any([]) False all([]) True