2016-05-15 8 views
9

Ich stolperte über das 'x = [m] * n' und lief es im Interpreter Ich kann sehen, dass der Code ein n-Element-Array mit initialisiert mit m. Aber ich kann eine Beschreibung dieser Art von Code online nicht finden. Wie heißt das?Was ist die Syntax x = [m] * n in Python?

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

[Liste wiederholen] (https://github.com/python/cpython/blob/master/Objects/listobject.c#L506) – YOU

+0

funktioniert auch mit Strings – inf

Antwort

12

von the Python docs' description, * der Multiplikationsoperator ist zwischen einer ganzen Zahl und einem n primitiven Sequenztyp führt Sequenz Wiederholung der Elemente in der Sequenz n Zeiten verwendet. Also ich nehme an, der Begriff, den Sie suchen, ist Sequenzwiederholung. Beachten Sie, dass dies kein "Sequenzkopieren" ist, da keine Kopien der Elemente erstellt werden - Sie haben n Referenzen auf die gleiche Sequenz.

+2

Ich wünschte, ich könnte zwei Antworten akzeptieren. Danke euch beiden. Steve S –

+1

Nur eine Anmerkung, ich nahm mir Zeit zu lernen, während Sie y hier Antwort schreiben: das '*' ist eigentlich für keine Sequenz definiert - es ist für die integrierten Sequenztypen definiert (List Tuple, Ste, Bytes, Bytearray) , ist aber nicht als Mixin-Funktionalität für die 'collections.abc.Sequence' vorhanden, die "de facto" ein "Sequenzprotokoll" definiert. (In Python 2.x, nur 'collections.Sequence') – jsbueno

+1

@jsbueno: Das liegt daran, dass' collections.abc.Sequence' nicht annehmen kann, dass Ihr Konstruktor ein iterbares Objekt wie eine Standardsequenz annehmen würde. Das gleiche Problem tritt bei Mengen auf, aber wenn Sie alle Mengenoperatoren weglassen, würden Sie eine Menge erhalten, die nicht viel von einer Menge ist, also haben sie das Aufzählungszeichen gebissen und die Annahme in einer privaten Methode gemacht, die Sie überschreiben können. – Kevin

17

* ist nur eine Multiplikation - wie + für Listen ist eine intuitive Sache, beide Operanden concatenate bedeutet, ist der nächste Schritt Multiplikation mit einem Skalar - mit [0] * N „verketten diese Liste mit selbst N-mal“, was bedeutet!

Mit anderen Worten: * ist ein Operator, der in Python für seine primitiven Sequenztypen und eine Ganzzahl definiert ist, um die Sequenz mit sich selbst so oft zu verketten. Es funktioniert mit Listen, Tupeln und sogar Strings. In Python ist das etwas natürlich, weil die Sprache Operatoren überlädt - also erwarten Python-Programmierer, dass Operatoren sinnvolle Dinge mit Objekten tun.

Man sollte vorsichtig sein, dass die Objekte, die die resultierende Liste bilden, keine Kopien der Objekte in der ursprünglichen Liste sind - sondern Verweise auf dasselbe Objekt. Wenn der Inhalt der ursprünglichen Liste also nur Zahlen oder ein anderes unveränderliches Objekt ist, gibt es keine Überraschungen - aber wenn er veränderbare Objekte enthält, wie z. B. innere Listen, könnte es bei der Änderung zu schweren Nebenwirkungen kommen - wie hier Schnipsel:

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

Der zweite Teil ist, was wirklich wichtig ist über diese Syntax. – Jasper

Verwandte Themen