*
просто умножение - в +
для списков является интуитивным вещь, то есть СЦЕПИТЬ обоих операндов, следующим шагом является умножение на скаляр - с [0] * N
означает «конкатенации этот список с собой N раз»!
Иными словами: *
является оператором, определенным в Python, для его примитивных типов последовательностей и целым числом, чтобы объединить последовательность с самим этим количеством раз. Он будет работать со списками, кортежами и даже строками.
Это довольно естественно в Python также потому, что язык позволяет перегружать оператора - поэтому программисты Python ожидают, что операторы будут делать значимые вещи с объектами.
Следует обратить внимание на то, что объекты, составляющие результирующий список, не являются копиями объектов в исходном списке, а являются ссылками на один и тот же объект. Таким образом, если содержимое исходного списка было просто числом или каким-либо другим неизменным объектом, сюрпризов нет - но если он содержит изменяемые объекты, такие как внутренние списки, то при их изменении могут быть поражены серьезные побочные эффекты - как в этом фрагмент кода:
In [167]: a = [[0]] * 7
In [168]: a
Out[168]: [[0], [0], [0], [0], [0], [0], [0]]
In [169]: a[0].append(1)
In [170]: a
Out[170]: [[0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1]]
[список повтор] (https://github.com/python/cpython/blob/master/Objects/listobject.c#L506) – YOU
работы со строками, а – inf