Это "сработало" и в вашем примере, по-своему. Именно так реализация list.__mul__
интерпретирует то, что вы хотите. Список не может создавать новые объекты, он не знает, как создавать новые объекты из любых объектов, которые он содержит. Он расширяет себя новыми ссылками на эти объекты.
Вы получаете то же поведение с неизменяемыми целыми числами
>>> x = [0] * 3
>>> x[0] is x[1]
True
Вы можете получить двумерный массив с помощью
>>> a = [[0]*3 for _ in range(4)]
>>> a[0] is a[1]
False
Причина, по которой [0] * 3
делает то, что вам нужно, заключается в том, что он создает список, содержащий 3 ссылки на один и тот же неизменяемый 0
.