It's not syntactic sugar at all, it's just multiplying a list. That is,
foo_list = [Foo()] * 3
is
foo_list = ( [Foo()] ) * 3
is
foo_instance = Foo()
bar_list = [foo_instance]
foo_list = bar_list * 3
No special syntax at all. It creates a list that has the same contents as the list being multiplied, three times.
One thing I use it for is when I get a list of unknown length and I want it to have exactly length n, then I add a list of n times a default value to it, then slice:
def set_to_length(l, n, defaultvalue=0):
return (l + [defaultvalue] * n)[:n]
Of course doing that with mutable defaultvalues leads to trouble, as you've found.