Что значит * перед list?
Это не магия, а преобразование массива в параметры.def func(a,b,c)
   print(a,b,c)

a=[1,2,3]
func(*a)
Также есть еще одна магия с двумя **.
Действует как именованные параметры для dict.a=dict(a=1,b=2,c=3)
func(**a)
Немного добавлю.
* - оператор раскрытия списка (list) или типла (tuple) в аргументы функции. Последовательность аргументов должна соответствовать последовательности списка.
** - оператор раскрытия словаря в именованные аргументы функции.
Можно вот прочитатьИли вот