2016-05-15 2 views
9

Я наткнулся на «x = [m] * n» и запустил его в интерпретаторе. Я вижу, что код выделяет n массив элементов, инициализированный m. Но я не могу найти описание этого типа кода в Интернете. Как это называется?Что такое синтаксис x = [m] * n в Python?

>>> x = [0]*7 
>>> x 
[0, 0, 0, 0, 0, 0, 0] 
+0

[список повтор] (https://github.com/python/cpython/blob/master/Objects/listobject.c#L506) – YOU

+0

работы со строками, а – inf

ответ

12

от the Python docs' description, оператор умножения * используется между целым числом и n примитивным типом последовательности выполняет последовательность повторение элементов в последовательности n раз. Поэтому я предполагаю, что термин, который вы ищете, это Последовательность повторения. Обратите внимание, что это не «копирование последовательностей», поскольку никакие копии элементов не создаются. У вас есть n ссылки на ту же последовательность.

+2

Желание я мог бы принять два ответа. Спасибо вам обоим. Steve S –

+1

Просто примечание. Я не торопился учиться, когда писал y здесь: '*' на самом деле не определен для любой последовательности - он определен для встроенных типов последовательностей (list tuple, ste, bytes, bytearray) , но нет в качестве функции mixin для 'collections.abc.Sequence', которая« де-факто »определяет« протокол последовательности ». (В Python 2.x, просто 'collections.Sequence') – jsbueno

+1

@jsbueno: Это потому, что' collections.abc.Sequence' не может предположить, что ваш конструктор примет итерируемый объект, как стандартная последовательность. Такая же проблема возникает с наборами, но при этом исключение всех операторов-операторов оставляет вас с набором, который не является большим количеством набора, поэтому они убрали пулю и сделали предположение в частном методе, который вы можете переопределить. – Kevin

17

* просто умножение - в + для списков является интуитивным вещь, то есть СЦЕПИТЬ обоих операндов, следующим шагом является умножение на скаляр - с [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]] 
+1

Вторая часть это то, что действительно имеет значение этого синтаксиса. – Jasper

Смежные вопросы