Различные способы очистки списков

208

Есть ли причина делать что-то более сложное, чем одна из этих двух строк, когда вы хотите очистить список в Python?

old_list = []
old_list = list()

Причина, по которой я спрашиваю, заключается в том, что я только что увидел это в каком-то работающем коде

del old_list[ 0:len(old_list) ]
johannix
источник
1
Почему вы это делаете? Сборка мусора работает. Почему бы просто не проигнорировать старое значение списка и позволить Python очистить его автоматически?
С.Лотт
40
@ S.Lott: автор не написал код и спрашивает, почему автор, возможно, сделал это.
Джон Фухи
1
Вы также можете сделать: while l: l.pop ()
RoadieRich
12
РЖУНИМАГУ. Я уверен, что это эффективно.
FogleBird
18
Не относится к вашему вопросу, но вы не должны использовать len при указании фрагмента. a[:x]означает начало до х и a[x:]означает х до конца. a[ 0:len(a) ]можно записать как a[:]. Вы также можете использовать негативы для подсчета с конца ( a[-1]это последний элемент).
idbrii

Ответы:

358

Очистка списка на месте повлияет на все остальные ссылки в этом же списке.

Например, этот метод не влияет на другие ссылки:

>>> 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[:] = []
Коба
источник
87
Вы также можете сделатьdel a[:]
idbrii
1
Почему первый только повлияет a? Я думал aи bссылаюсь на один и тот же объект ... Просто хочу знать почему. Спасибо.
Алстон
38
С питоном 3.3 и выше вы можете работать a.clear()без проблем!
Марек Левандовски
4
@Stallman, потому что сначала вы меняете ссылку на 'a', чтобы указывать на новый массив, а не очищать его, а b все еще указывает на старый
Pax0r
4
Было бы здорово, если бы кто-нибудь мог показать разницу в производительности между этими методами!
Суанмейго
37

Выполнение alist = []не очищает список, просто создает пустой список и привязывает его к переменной alist. Старый список все еще будет существовать, если у него были другие привязки переменных.

Чтобы на самом деле очистить список на месте , вы можете использовать любой из этих способов:

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

Смотрите страницу документации Mutable Sequence Types для более подробной информации.

Евгений Ярмаш
источник
2
Я проверил, и alist * = 0 самый быстрый, следующий самый быстрый - alist.clear (), а два других метода одинаково быстрые. Не могли бы вы объяснить, почему alist * = 0 самый быстрый?
Дженни
3
@ Дженни: он просто использует меньше (или дешевле) кодов операций под капотом. Например, версия оператора не должна искать имена каких-либо методов или создавать фрагменты.
Евгений Ярмаш
«Должен быть один - и желательно только один - очевидный способ сделать это». Питон сияет здесь :)
Ник О'Лай
36

Существует очень простой способ очистить список Python. Используйте del list_name [:] .

Например:

>>> a = [1, 2, 3]
>>> b = a
>>> del a[:]
>>> print a, b
[] []
NixMan
источник
13

Мне кажется, что del вернет вам память, в то время как назначение нового списка приведет к удалению старого только тогда, когда gc runs.matter.

Это может быть полезно для больших списков, но для небольшого списка оно должно быть незначительным.

Редактировать : как Algorias, это не имеет значения.

Обратите внимание, что

del old_list[ 0:len(old_list) ]

эквивалентно

del old_list[:]
Besen
источник
2
gc не работает в циклах. Список освобождается, как только удаляется его последняя ссылка.
Алгориас
2
Алгории: это верно для CPython, но не может быть для других реализаций.
Ммсмит
2
del old_list [0: len (old_list)] и del old_list [:] имеют одинаковый результат, но последний быстрее (проверено в Python 2.6)
Рой Нитерау
6
del list[:] 

Удалит значения этой переменной списка

del list

Удалит саму переменную из памяти

ytpillai
источник
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
Alex
источник
3

Если вы очищаете список, вам, очевидно, он больше не нужен. Если это так, вы можете просто удалить весь список простым методом del.

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

Но в случае, если вам это понадобится снова, вы можете переинициализировать его. Или просто очистите его элементы

del a[:]
lavee_singh
источник
-4

другое решение, которое работает отлично, - создать пустой список в качестве справочного пустого списка.

empt_list = []

например у вас есть список как a_list = [1,2,3]. Чтобы очистить его, просто сделайте следующее:

a_list = list(empt_list)

это создаст a_listпустой список, как и empt_list.

Мунир Бен
источник
Нет причин создавать empt_list. Просто используйте a_list = list ().
Дэниел Хардинг,