Різні способи очищення списків


207

Чи є якась причина зробити щось складніше, ніж один із цих двох рядків, коли ви хочете очистити список у Python?

old_list = []
old_list = list()

Причина, яку я запитую, полягає в тому, що я щойно бачив це в деякому запущеному коді:

del old_list[ 0:len(old_list) ]

1
Чому ви це робите? Збір сміття працює. Чому б просто не проігнорувати старе значення списку і не дати Python автоматично очистити його?
С.Лотт

40
@ S.Lott: Афіша не написала код і запитує, чому оригінальний автор може це зробити.
Джон Фугі

1
Ви також можете зробити: поки l: l.pop ()
RoadieRich

12
ЛОЛ. Я впевнений, що це ефективно.
FogleBird

18
Не пов’язано з вашим запитанням, але вам не слід використовувати len, визначаючи фрагмент. a[:x]означає починаючи з x і a[x:]означає x до кінця. a[ 0:len(a) ]можна записати як a[:]. Ви також можете використовувати мінуси для підрахунку від кінця ( a[-1]це останній елемент).
idbrii

Відповіді:


356

Видалення списку на місці вплине на всі інші посилання цього ж списку.

Наприклад, цей метод не впливає на інші посилання:

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

Але це робить:

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

Ви також можете зробити:

>>> a[:] = []

86
Ви також можете зробитиdel a[:]
idbrii

1
Чому перша вплине лише a? Я думав aі bпосилався на той самий об’єкт ... Просто хочу знати, чому. Дякую.
Елстон

37
З python 3.3 та пізнішими версіями ви можете перейти a.clear(), без проблем!
Марек Левандовський

4
@Stallman, оскільки спочатку ви змінюєте посилання на "a", щоб вказати на новий масив, не очищаючи його, а b все ще вказує на старий
Pax0r

4
Було б чудово, якби хтось міг показати різницю в роботі між цими методами!
Suanmeiguo

37

Здійснення alist = []не очищає список, просто створює порожній список і прив'язує його до змінної alist. Старий список все ще буде існувати, якщо він мав інші змінні прив'язки.

Щоб дійсно очистити список на місці , ви можете скористатися будь-яким із цих способів:

  1. alist.clear() # Python 3.3+, most obvious
  2. del alist[:]
  3. alist[:] = []
  4. alist *= 0 # fastest

Докладнішу інформацію див. На сторінці документації щодо типів змінних послідовностей .


2
Я перевірив, і alist * = 0 найшвидший, наступний найшвидший - alist.clear (), а інші два методи однаково швидкі. Чи можете ви пояснити, чому alist * = 0 найшвидший?
Дженні

3
@Jenny: Він просто використовує менше (або менш дорогі) опкоди під кришкою. Наприклад, операційній версії не потрібно шукати імена методів або створювати фрагменти.
Євген Ярмаш

"Має бути один-- і бажано лише один - очевидний спосіб це зробити". Тут світить Python :)
Nik O'Lai

36

Існує дуже простий спосіб очистити список пітонів. Використовуйте del list_name [:] .

Наприклад:

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

13

Мені здається, що del поверне вам пам'ять, а при призначенні нового списку буде видалено старий лише тоді, коли gc run.matter.

Це може бути корисно для великих списків, але для малого списку воно повинно бути незначним.

Редагувати : Як Алгорій, це не має значення.

Зауважте, що

del old_list[ 0:len(old_list) ]

еквівалентно

del old_list[:]

2
gc не запускається циклами. Список звільняється, як тільки його остання посилання скидається.
Алгоріас

2
Алгорії: це справедливо для CPython, але може не бути для інших реалізацій.
mhsmith

2
del old_list [0: len (old_list)] і del old_list [:] мають однаковий результат, але останній швидший (перевірено в Python 2.6)
Roy Nieterau

6
del list[:] 

Видалить значення цієї змінної списку

del list

Видалить саму змінну з пам'яті


5

Є два випадки, коли ви, можливо, захочете очистити список:

  1. Ви хочете використовувати ім’я old_listдалі у своєму коді;
  2. Ви хочете, щоб старий список як можна швидше збирав сміття, щоб звільнити деяку пам’ять;

У випадку 1 ви просто продовжуєте завдання:

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

У випадку 2 delзаява зменшить посилання на об'єкт списку, на якому old listвказуються імена . Якщо об'єкт списку вказується лише ім'ям old_listна, кількість посилань буде 0, а об'єкт буде вивільнений для вивезення сміття.

    del old_list

3

Якщо ви очищаєте список, вам, очевидно, цей список більше не потрібен. Якщо це так, ви можете просто видалити весь список простим методом del.

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

Але у випадку, якщо він вам знову потрібен, ви можете його повторно реалізувати. Або просто просто очистити його елементи

del a[:]

-4

Ще одне рішення, яке добре працює - це створити порожній список як довідковий порожній список.

empt_list = []

наприклад, у вас є список як a_list = [1,2,3]. Щоб очистити це, просто зробіть наступне:

a_list = list(empt_list)

це зробить a_listпорожній список так само, як і empt_list.


Немає підстав для створення empt_list. Просто використовуйте a_list = list ().
Даніель Хардінг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.