This is called unpacking. If the list (or any other iterable) contains two-element iterables, they can be unpacked so the individual elements can be accessed as a and b.
For example, if list was defined as
list = [(1, 2), (3, 4), (4, 6)]
your final result would be
arr = [3, 7, 10]
You can unpack as many elements as you need to into as many variables as you need. The only catch is that all the elements of the list must be the same length for this to work (since you are specifying the number of variables to unpack into up front).
A more common usage of this construction (possibly the most common I have seen) is with enumerate, which returns a tuple with the index as well as the item from an iterable. Something like:
arr = [ind + item for ind, item in enumerate(numbers)]