2015-05-31 14 views
32

Jaki jest najbardziej efektywny sposób opróżniania listy?Jaka jest różnica między del a [:] a a = [], gdy chcę opróżnić listę o nazwie w python?

Mam listę o nazwie a = [1,2,3]. Aby usunąć zawartość listy, zazwyczaj piszę: a = [ ]. Natknąłem się na funkcję w python o nazwie del. Chcę wiedzieć, czy istnieje różnica między del a [:] a tym, czego używam.

+1

Podobnie jak wyjaśnienie, 'del' w python jest w rzeczywistości _statement_, a nie _function_. – mintchkin

+6

W Pythonie 3 * proszę * użyć 'a.clear()'. Dokumenty mówią, że jest to równoważne "del a [:]" i * drodze * bardziej czytelnej. –

+2

I oczywiście istnieje również "a [:] = []", które mniej więcej tak samo jak "del a [:]" – driax

Odpowiedz

59

Występuje różnica i ma to związek z tym, czy do tej listy odwołuje się wiele miejsc/nazw.

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

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

Korzystanie del a[:] czyści listę istniejący, co oznacza, gdziekolwiek to odwołuje stanie się pusta lista.

Korzystanie a = [] zestawy a wskazywać na nowy pustą listę, co oznacza, że ​​w innych miejscach oryginalna lista odwołuje pozostanie niepusty.

Kluczem do zrozumienia tutaj jest uświadomienie sobie, że kiedy przypisujesz coś do zmiennej, po prostu sprawia, że ​​nazwa wskazuje na coś. Rzeczy mogą mieć wiele nazw, a zmiana tego, co wskazuje nazwa, nie zmienia samej rzeczy.

+1

Ten przykład był jasny i łatwy do zrozumienia. –

+0

Chciałbym również podkreślić, że 'a = [] 'jest szybszy niż' del a [:] ' – JosiahDaniels

+3

@JosiahDaniels, który technicznie pozostaje prawdziwy, jeśli' a' nie jest ostatnim odnośnikiem do listy. Jeśli tak, to ponowne przypisanie go spowoduje, że wyrzucanie elementów będzie zasadniczo wywoływać 'del a [:]' za kulisami. – mintchkin

10

Można chyba najlepiej pokazano:

>>> a = [1, 2, 3] 
>>> id(a) 
45556280 
>>> del a[:] 
>>> id(a) 
45556280 
>>> b = [4, 5, 6] 
>>> id(b) 
45556680 
>>> b = [] 
>>> id(b) 
45556320 

Kiedy robisz a[:] którego się odnosimy się do wszystkich elementów na liście „przypisane” do a. Instrukcja del usuwa odwołania do obiektów. Czyli del a[:] mówi "usuń wszystkie odniesienia do obiektów z listy przypisanej do a". Sama lista się nie zmieniła. Możemy to zobaczyć za pomocą funkcji id, która podaje nam liczbę reprezentującą obiekt w pamięci. Identyfikator listy przed użyciem del i po nim pozostaje taki sam, wskazując, że ten sam obiekt listy jest przypisany do a.

Z drugiej strony, gdy przypisujemy niepusty listę b a następnie przypisać nową listę pusty do b, zmiany identyfikatora. Dzieje się tak, ponieważ faktycznie przenieśliśmy numer referencyjny b z istniejącej listy [4, 5, 6] na nową listę .

Beyond tylko tożsamość obiektów, które mają do czynienia z, istnieją inne rzeczy, aby mieć świadomość:

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

Zarówno b i a odnoszą się do tej samej listy. Usunięcie elementów z listy a bez zmiany samej listy powoduje mutację listy w miejscu. Ponieważ b odnosi się do tego samego obiektu, widzimy tam ten sam wynik. Jeśli zamiast tego zrobiłeś a = [], a będzie odnosić się do nowej pustej listy, podczas gdy b będzie nadal odnosić się do listy [1, 2, 3].

6
>>> list1 = [1,2,3,4,5] 
>>> list2 = list1 

Aby lepiej zrozumieć, przyjrzyjmy się za pomocą obrazów, co dzieje się wewnątrz.

>>> list1 = [1,2,3,4,5] 

ten tworzy obiekt listy i przypisuje go do list1. Initialization of list1 in memory

>>> list2 = list1 

listy obiektów, które list1 odnosił się również przypisane do list2.

Teraz przyjrzyjmy się metodom opróżniania listy i temu, co dzieje się wewnętrznie.

METODA 1: Zestaw do pustej listy []:

>>> list1 = [] 
>>> list2 
[1,2,3,4,5] 

Set list1 to empty list

nie usuwać elementy z listy, ale usuwa odniesienia do listy. Tak więc list1 wskazuje teraz na pustą listę, ale wszystkie inne odniesienia będą miały dostęp do tego starego list1. Ta metoda tworzy nowy obiekt listy i przypisuje go do list1. Wszelkie inne referencje pozostaną.

Metoda 2: Usuń z użyciem operatora plaster [:]:

>>> del list1[:] 
>>> list2 
[] 

Delete all elements of list1 using slice operator

Kiedy używamy operatora plasterek, aby usunąć wszystkie elementy z listy, a następnie wszystkich miejsc, gdzie jest odwołany, staje się pustą listą. Tak więc list2 również staje się pustą listą.

0

Cóż, del wykorzystuje nieco mniej miejsca w komputerze, jak sugeruje osoba powyżej mnie. Komputer nadal akceptuje zmienną jako ten sam kod, z wyjątkiem innej wartości. Jeśli jednak zmiennej przypisano coś innego, komputer przypisuje jej zupełnie inny identyfikator, aby uwzględnić wymaganą zmianę pamięci.

Powiązane problemy