2015-04-30 12 views
32

Ich komme manchmal über diese Art zu drucken oder eine Liste zurück - someList[:]. Ich sehe nicht, warum Menschen es verwenden, da es die vollständige Liste zurückgibt.Was macht diese Notation für Listen in Python: "someList [:]"?

Warum nicht einfach someList schreiben, ohne den [:] Teil?

+0

beziehen Sie sich auf eine bestimmte Sprache? –

+5

mögliche Duplikate von [Wie klonen oder kopieren Sie eine Liste in Python?] (Http://stackoverflow.com/questions/2612802/how-to-clone-or-copy-a-list-in-python) –

+5

möglich duplizieren of [Erklären Pythons Slice-Notation] (http://stackoverflow.com/questions/509211/explain-pythons-slice-notation) – LittlePanda

Antwort

54

[:] schafft eine Scheibe, verwendet in der Regel nur einen Teil einer Liste zu bekommen. Ohne ein angegebenes Minimum/Maximum wird eine Kopie der gesamten Liste erstellt. Hier ist eine Sitzung Python zeigt es:

>>> a = [1,2,3] 
>>> b1 = a 
>>> b2 = a[:] 
>>> b1.append(50) 
>>> b2.append(51) 
>>> a 
[1, 2, 3, 50] 
>>> b1 
[1, 2, 3, 50] 
>>> b2 
[1, 2, 3, 51] 

Hinweis, wie man b1 anhängt auch den Wert auf a angehängt. Das Anfügen an b2 hat jedoch a nicht modifiziert, d.h. b2 ist eine Kopie.

+0

Danke, Frerich, ich verstehe es jetzt. In den Fällen, in denen ich dabei war, wurde [...] tatsächlich dazu benutzt, eine Liste zu erstellen. –

+19

Es ist wahrscheinlich erwähnenswert, dass dies eine * flache * Kopie der Liste erzeugt, so dass das Muster zu Problemen führen kann, wenn Sie zB Listen von Listen haben. – sapi

+1

Von einer "expliziten ist besser als implizit" Sichtweise, könnte es besser sein, "Import-Kopie" und stattdessen '' copy.copy (lst) '' 'statt. Die Slice-Notation deutet nicht darauf hin, was sie tut und ist schwer zu googeln. –

8

Um erstellen Sie eine Kopie einer Liste statt durch Verweis, wie Python. Verwenden Sie die nächsten beiden Beispiele, um den Unterschied zu verstehen.

Beispiel:

# Passing by reference 
SomeListA = [1, 2, 3] 
SomeListB = [2, 3, 4] 
SomeListB = SomeListA 
SomeListA[2] = 5 
print SomeListB 
print SomeListA 

# Using slice 
SomeListA = [1, 2, 3] 
SomeListB = [2, 3, 4] 
SomeListB = SomeListA[:] 
SomeListA[2] = 5 
print SomeListB 
print SomeListA 
4

Wenn Sie benötigen um die Liste zu ändern und Sie nicht wollen, um die Liste zu ändern und eine andere Liste, die Sie

y = [1,2,3] 
x = y[:] 

verwenden und Sie können eine Menge von Änderungen an der Liste tun, aber der Ursprung Liste sein in (y) und die modifizierte in (x)

16

in python, wenn Sie a = b tun, ein dem Wert von b nicht übernimmt, sondern Referenzen den gleichen Wert von b verwiesen. Um dies zu sehen, machen:

>>> a = {'Test': 42} 
>>> b = a 
>>> b['Test'] = 24 

Was ist nun der Wert von a?

>>> a['Test'] 
24 

Es mit Listen ähnlich ist, so müssen wir einen Weg, um wirklich kopieren eine Liste, und nicht machen einen Verweis, um es zu finden. Eine Möglichkeit besteht darin, die Liste copy = list(list1) neu zu erstellen oder die Funktionen des Moduls copy zu verwenden. Aber schließlich ist der einfachste Weg, der schönste, der beste Weg (;)) dafür, jeden Wert der ersten Liste in den anderen zu kopieren, indem man copy = list1[:] tut. Es benutzt die Slices, hier wird list1 vom Index 0 zum Index len (list1) geschnitten, also wird die ganze list1 zurückgegeben!

Darüber hinaus ist die Slice-Methode etwas schneller: Mit der Methode time.clock() messen Sie die mittlere Ausführungszeit von 1000 Zuweisungen von Listen mit jeweils 10000 zufälligen Ganzzahlen mit Slices, Konstruktor und Deepcopy Die Schnitte sind 15% schneller als die Konstruktormethode und deepcopy ist 4 mal langsamer. Dieser Zeitgewinn ist jedoch vernachlässigbar, wenn kleine Listen verwendet werden: Die Verwendung von copy = list(list_to_copy) oder copy = list_to_copy[:] entspricht also den Vorlieben des Entwicklers.

Schließlich vergessen wir oft die list.copy Methode, die schneller zu sein scheint! Tatsächlich ist es sogar 13% schneller als die Slice-Methode!

+1

"(für veränderbare Objekte ...)": Um klar zu sein, funktioniert "b = a" genauso, wenn "a" veränderlich ist oder wenn "a" unveränderlich ist. – DSM

+0

@DSM Ja Sie haben Recht, ich werde es korrigieren! – Spirine

+0

Ich denke "der einfachste Weg, der schönste, der beste Weg" ist ziemlich subjektiv (und ich stimme nicht zu, ich mag 'liste (a)' besser als 'a [:]'). –