2009-05-12 14 views
159

Gibt es einen Grund, etwas komplizierter als eine dieser beiden Zeilen zu tun, wenn Sie eine Liste in Python löschen möchten?Verschiedene Arten zum Löschen von Listen

old_list = [] 
old_list = list() 

Der Grund, warum ich frage ist, dass ich sah dies nur in einigen Lauf Code:

del old_list[ 0:len(old_list) ] 
+1

Warum machst du das? Müllsammlung funktioniert. Warum nicht einfach den alten Wert der Liste ignorieren und Python automatisch bereinigen lassen? –

+32

@ S.Lott: Das Poster hat den Code nicht geschrieben und fragt, warum der ursprüngliche Autor das getan hat. –

+14

Nicht verwandt mit Ihrer Frage, aber Sie sollten len nicht verwenden, wenn Sie ein Segment angeben. 'a [: x]' bedeutet, zu x zu beginnen und 'a [x:]' bedeutet x zu enden. 'a [0: len (a)]' kann als 'a [:]' geschrieben werden. Sie können auch Negative verwenden, um vom Ende aus zu zählen ('a [-1]' ist das letzte Element). – idbrii

Antwort

303

eine Liste anstelle Clearing alle anderen Referenzen der gleichen Liste beeinflussen.

Zum Beispiel ist diese Methode nicht andere Referenzen beeinflussen:

>>> a = [1, 2, 3] 
>>> b = a 
>>> a = [] 
>>> print(a) 
[] 
>>> print(b) 
[1, 2, 3] 

Aber das tut:

>>> a = [1, 2, 3] 
>>> b = a 
>>> del a[:]  # equivalent to del a[0:len(a)] 
>>> print(a) 
[] 
>>> print(b) 
[] 
>>> a is b 
True 

könnten Sie auch tun:

>>> a[:] = [] 
+6

Hmm, du lernst jeden Tag etwas Neues. –

+80

Sie können auch 'del a [:]' – idbrii

+1

Warum die erste nur 'a' betrifft? Ich dachte 'a' und' b' Bezug auf dasselbe Objekt ... Ich will nur wissen warum. Vielen Dank. – Stallman

11

Es scheint, für mich wird dir del die Erinnerung zurückgeben, während das Zuweisen einer neuen Liste die alte machen wird gelöscht nur, wenn der GC runs.matter.

Dies kann für große Listen nützlich sein, aber für kleine Listen sollte es vernachlässigbar sein.

Bearbeiten: Als Algorias ist es egal.

Beachten Sie, dass

del old_list[ 0:len(old_list) ] 

entspricht

del old_list[:] 
+2

GC wird nicht in Zyklen ausgeführt. Die Liste wird freigegeben, sobald die letzte Referenz gelöscht wurde. – Algorias

+2

Algorias: das gilt für CPython, aber möglicherweise nicht für andere Implementierungen. – mhsmith

+1

del old_list [0: len (old_list)] und del old_list [:] haben ein gleiches Ergebnis, aber letzteres ist schneller (in Python 2.6 eingecheckt) –

4

Es gibt zwei Fälle, in denen Sie eine Liste löschen möchten:

  1. Sie wollen den Namen verwenden old_list weiter in deinem Code;
  2. Sie möchten, dass die alte Liste so schnell wie möglich unbemerkt gesammelt wird, um Speicherplatz freizugeben.

Im Fall 1 Sie nur mit dem assigment gehen:

old_list = [] # or whatever you want it to be equal to 

Im Fall 2 die del Anweisung in die Liste der Referenzzahl reduzieren würde auf den Namen old list Punkte widersprechen. Wenn auf das Listenobjekt nur der Name old_list at zeigt, wäre der Verweiszähler 0, und das Objekt würde für die Speicherbereinigung freigegeben.

del old_list 
30

Es gibt eine sehr einfache Möglichkeit, eine Python-Liste zu löschen. Verwenden Sie del list_name [:].

Zum Beispiel:

>>> a = [1, 2, 3]` 
>>> b = a 
>>> del a[:] 
>>> print a, b 
[] [] 
3
del list[:] 

Werden die Werte dieser Liste löschen Variable

del list 

die Variable selbst aus dem Speicher löschen Wird

1

Wenn Sie die Liste sind Clearing Sie brauchen die Liste offensichtlich nicht mehr. Wenn dies der Fall ist, können Sie einfach die gesamte Liste mit der einfachen Del-Methode löschen.

a = [1, 3, 5, 6] 
del a # This will entirely delete a(the list). 

Aber für den Fall, müssen Sie es wieder, können Sie es neu initialisieren kann. Oder einfach löschen Sie einfach seine Elemente von

-1

eine andere Lösung, die gut funktioniert, ist eine leere Liste als leere Referenzliste zu erstellen.

empt_list = [] 

zum Beispiel haben Sie eine Liste als a_list = [1,2,3]. So löschen Sie es machen nur die folgenden:

a_list = list(empt_list) 

dies a_list eine leere Liste machen ebenso wie die empt_list.

2

Um eine Liste in-place in Python löschen 3.3+ Sie auch list.clear() verwenden können, die mit den Schnittstellen anderer wandelbaren Container (wie dict, set oder deque) konsistent ist.

old_list.clear() # removes all items from old_list (same as del old_list[:]) 
Verwandte Themen