Was bedeutet?

94

Ich analysiere Python-Code und weiß nicht was

pop = population[:]

meint. Ist es so etwas wie Array-Listen in Java oder wie ein zweidimensionales Array?

andriy
quelle
1
Das Löschen einer Liste ist nur mit del pop [:] oder pop [:] = [] möglich, nicht mit pop.clear () .. (wie bei Diktaten).
Macke
Gute SO Diskussion von Python Slice: stackoverflow.com/questions/509211/…
Scott C Wilson

Antworten:

109

Es ist ein Beispiel für die Slice-Notation, und was sie tut, hängt von der Art der Slice-Notation ab population. Wenn populationes sich um eine Liste handelt, wird in dieser Zeile eine flache Kopie der Liste erstellt. Für ein Objekt vom Typ tupleoder a strwird nichts ausgeführt (ohne die Zeile wird dasselbe ausgeführt [:]), und für ein NumPy-Array (z. B.) wird eine neue Ansicht für dieselben Daten erstellt.

Sven Marnach
quelle
14
Nur für den Fall: Das Slice gibt eine flache Kopie zurück.
André Caron
4
@ilius: Vielleicht l.copy()ist besser lesbar, aber es wird nicht funktionieren.
Sven Marnach
13
list(l)funktioniert immer, ist besser lesbar und garantiert eine Kopie auch mit so etwas wienumpy.array
Rosh Oxymoron
1
@ Eli: Ja, daneben list.clear(). Es wird jedoch einige Zeit dauern, bis dies zu einer signifikanten Reduzierung dieser Art von Fragen zu SO führt. :)
Sven Marnach
1
@ MichaelGraczyk: Ich nehme an, Sie sprechen hier über NumPy-Arrays. Anstatt zu verwenden A[deque(chain((k,), repeat(slice(None), len(A.shape) - 1)).rotate(axis)], würde ich es fast immer vorziehen numpy.rollaxis(A, axis, 0)[k]. Im Allgemeinen bin ich selten auf einen Anwendungsfall gestoßen, bei dem Sie slice()Objekte direkt erstellen müssten . Wenn Sie sie trotzdem benötigen, bietet NumPy den s_Helfer als alternative Möglichkeit, sie zu erstellen.
Sven Marnach
27

Es kann auch hilfreich sein zu wissen, dass ein Listen-Slice im Allgemeinen eine Kopie eines Teils der Liste erstellt. ZB population[2:4]wird eine Liste zurückgegeben, die Population [2] und Population [3] enthält (das Schneiden ist ausschließlich rechts). Lassen Sie den linken und rechten Index weg, da population[:]sie standardmäßig 0 bzw. Länge (Grundgesamtheit) sind, und wählen Sie dabei die gesamte Liste aus. Daher ist dies eine gängige Redewendung, um eine Kopie einer Liste zu erstellen.

ThomasH
quelle
15

Nun ... das hängt wirklich vom Kontext ab. Letztendlich übergibt es ein sliceObjekt ( slice(None,None,None)) an eine der folgenden Methoden : __getitem__, __setitem__oder __delitem__. (Wenn das Objekt ein __getslice__hat, wird dieses anstelle von verwendet __getitem__, aber das ist jetzt veraltet und sollte nicht verwendet werden.)

Objekte können mit dem Slice machen, was sie wollen.

Im Zusammenhang mit:

x = obj[:]

Dies wird obj.__getitem__mit dem übergebenen Slice-Objekt aufgerufen . Tatsächlich entspricht dies vollständig:

x = obj[slice(None,None,None)]

(obwohl ersteres wahrscheinlich effizienter ist, weil es den sliceKonstruktor nicht nachschlagen muss - alles erfolgt in Bytecode).

Für die meisten Objekte ist dies eine Möglichkeit, eine flache Kopie eines Teils der Sequenz zu erstellen.

Nächster:

x[:] = obj

Ist eine Möglichkeit, die Elemente (die aufgerufen werden __setitem__) basierend auf festzulegen obj.

und ich denke, Sie können wahrscheinlich erraten, was:

del x[:]

Anrufe ;-).

Sie können auch verschiedene Slices übergeben:

x[1:4]

Konstrukte slice(1,4,None)

x[::-1]

Konstrukte slice(None,None,-1)und so weiter. Lesen Sie weiter: Erklären Sie Pythons Slice-Notation

mgilson
quelle
10

Es ist ein Stück vom Anfang der Sequenz bis zum Ende, das normalerweise eine flache Kopie erzeugt.

(Nun, es ist mehr als das , aber du musst dich noch nicht darum kümmern.)

Ignacio Vazquez-Abrams
quelle
6

Es wird eine Kopie der Liste erstellt, anstatt nur einen neuen Namen für die bereits vorhandene Liste zuzuweisen.

Jim Brissom
quelle
5

[:]
wird zum Begrenzen oder Schneiden im Array verwendet, Hash
zB:
[1: 5] zum Anzeigen von Werten zwischen 1 einschließlich und 5 exklusiv, dh 1-4
[Start: Ende],

das im Array zum Schneiden im Grunde genommen verwendet wird Wert oder Schlüssel, der angezeigt werden soll, und ":" wird verwendet, um das gesamte Array zu begrenzen oder in Pakete aufzuteilen.

Vijay Balkrishna konduskar
quelle
1
Kein Grund, eine so alte Frage zu beantworten, die bereits 5 ähnliche und sogar eine akzeptierte Antwort hat ... Außerdem werden a[1:5]die Elemente 1-4 und nicht 2-4 zurückgegeben.
Skamah One
@ KamamOne Oh, ich weiß es nicht. Vielleicht nicht in diesem Fall, aber es gibt Zeiten, in denen es von Wert sein kann, tote Fragen zu stellen. Unterschiedliche Einsichten, unterschiedliche Formulierungen usw. In diesem Fall haben Sie die Antwort korrigiert und sie haben hoffentlich auch etwas gelernt.
Pryftan