what is it?

when an argument is already in a list, tuple or dictionary, but needs to be unpacked for a function call requiring separate positional arguments. link

unpacking lists or tuples

>>> list(range(3, 6))            # normal call with separate arguments
[3, 4, 5]
 
>>> args = [3, 6]
>>> list(range(*args))            # call with arguments unpacked from a list
[3, 4, 5]

unpacking dictionaries

>>> def parrot(voltage, state='a stiff', action='voom'):
...    print("-- This parrot wouldn't", action, end=' ')
...    print("if you put", voltage, "volts through it.", end=' ')
...    print("E's", state, "!")
 
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !