How does all() in python work on empty lists

I am referring to the following python code

all(a==2 for a in my_list)

I expect the above code to return True if all the elements in my_list are 2. but when I make my_list empty and run it as

my_list = []
all(a==2 for a in my_list) 

it returns True as well. I am confused with this behaviour. Is it not supposed to return False as there is no element in my_list with value 2?


Solution 1:

It's true because for every element in the list, all 0 of them, they all are equal to 2.

You can think of all being implemented as:

def all(list, condition):
  for a in list:
    if not condition(a):
      return false
  return true

Whereas any is:

def any(list, condition):
  for a in list:
    if condition(a):
      return true
  return false

That is to say, all is innocent until proven guilty, and any is guilty until proven innocent.

Solution 2:

"all" applied to an empty list is "vacuously true", as is easily confirmed:

>>> all([])
True

Similarly, "if 0 = 1 then the moon is square" is true. More generally, "all P are Q" -- if there are no P's then the statement is considered true, as it can be captured formally as "For all x, if x is P then x is Q". Ultimately, these are true because the conditional logical operator (if-then) evaluates to True whenever the antecedent (the first clause) is False: "if False then True" evaluates to True. Recall that "if A then B" is equivalent to "(not A) or B".

Added 1-2022 In the case of all and Python lists, the boolean value of all(my_list) is the value of

"for all items `x` in `my_list`, the value of `x` is truthy". 

When my_list is empty, that value is True. Again, "for all" and all make no existence claim.

In Python pseudocode, all works roughly like this:

val = True
for x in my_list:
    if not x:
        val = False
        break
# assert val == all(my_list)