Как очистить список?

Такое "грязное" опустошение списка выглядит так:

while len(alist) > 0 : alist.pop()

Существует ли для этого четкий способ?


person DrFalk3n    schedule 09.09.2009    source источник
comment
Так почему же в словах и наборах Python есть метод clear (), а не списки?   -  person job    schedule 09.09.2009
comment
Но если на объект есть несколько ссылок, это может быть полезно.   -  person Ned Deily    schedule 10.09.2009
comment
Это может быть полезно, если мне нужно очистить общий список процессов во время выполнения и не нужно ждать сбора мусора (или я ошибаюсь? Я неправильно понял сборку мусора?). Также, если я хочу проверить каждый всплывающий элемент, я могу отладить его, пока не могу использовать нарезку (или я ошибаюсь). Мне не нужно останавливать выполнение процесса при очистке моего списка.   -  person DrFalk3n    schedule 10.09.2009
comment
@ S.Lott То, что вы не понимаете, почему это важно, не означает, что все остальные этого не делают. Если несколько объектов зависят от общего списка, это будет иметь значение. В некоторых шаблонах проектирования это важно. Сборщик мусора означает, что вам не нужно убирать за собой; это не лицензия, чтобы создавать еще больший беспорядок.   -  person UpAndAdam    schedule 27.04.2013
comment
Несмотря на любые другие, лучшие ответы, ваш исходный код можно было бы написать: while alist: alist.pop ()   -  person MrWonderful    schedule 24.11.2014


Ответы (7)


Это фактически удаляет содержимое из списка, но не заменяет старую метку новым пустым списком:

del lst[:]

Вот пример:

lst1 = [1, 2, 3]
lst2 = lst1
del lst1[:]
print(lst2)

Для полноты картины назначение срезов имеет тот же эффект:

lst[:] = []

Его также можно использовать для уменьшения части списка при одновременной замене части (но это выходит за рамки вопроса).

Обратите внимание, что выполнение lst = [] не очищает список, а просто создает новый объект и привязывает его к переменной lst, но старый список по-прежнему будет содержать те же элементы, и эффект будет очевиден, если у него были другие привязки переменных.

person fortran    schedule 09.09.2009
comment
Еще два вопроса: что такое del? (Я предполагаю, что это многое, но я действительно не знаю, что это такое) и 2-й: Как вы читаете (вслух) [:] - person OscarRyz; 09.09.2009
comment
Для звукового объяснения del я бы обратился к документации: docs .python.org / reference / simple_stmts.html # the-del-statement. - person fortran; 09.09.2009
comment
Обычно я не читаю вслух код Python xD, но если бы мне пришлось, я бы сказал, что я бы сказал срез от начала до конца списка l. - person fortran; 09.09.2009
comment
@jellybean совершенно непреднамеренно ^ _ ^ Английский не мой родной язык, поэтому я действительно не заметил разницы между двумя комментариями. - person fortran; 06.05.2010
comment
если мы сделаем l = [], не будет ли сборщик мусора сборщика мусора старого списка? - person Alex Punnen; 15.03.2016
comment
@AlexPunnen: да, это не проблема; таким образом, это не было упомянуто в ответе - person fortran; 15.03.2016
comment
Хорошо, OscarRyz, если вы начнете перехватывать переменные из произвольного цикла вывода где-нибудь в массив, который выглядит как i=[], тогда все новые собранные данные будут проиндексированы в массиве на одно число выше последнего, начиная с 0. Но когда вы впервые сделаете свой массив, он пуст. Вы, конечно, можете распечатать его как print i, но на выходе будет только []. Кроме того, попробуйте конкретизировать: print i[0] или print i[3], и вы получите исключение. Однако, пока данные хранятся в массиве, del i[x] можно использовать для очистки любой одной или нескольких из этих индексированных позиций. - person Musixauce3000; 05.04.2016
comment
что бы вы ни делали, не делайте [:] = [] или a = [] на python 3, это неэффективно и очень медленно, особенно если вы выполняете итерацию и очищаете - person Serak Shiferaw; 27.03.2019

Если вы используете Python 3.3 или выше, вы можете использовать _1 _ метод list, который параллелен clear() dict, set, deque и другим изменяемым типам контейнеров:

alist.clear()  # removes all items from alist (equivalent to del alist[:])

Как указано на странице документации по ссылке, то же самое можно сделать и с alist *= 0.

Подводя итог, можно сказать, что существует четыре эквивалентных способа очистки списка на месте (в отличие от Дзен Python!):

  1. alist.clear() # Python 3.3+
  2. del alist[:]
  3. alist[:] = []
  4. alist *= 0
person Eugene Yarmash    schedule 06.05.2015
comment
Этот ответ должен быть вверху, что не так с stackoverflow! - person BreakBadSP; 03.08.2018

Вы можете попробовать:

alist[:] = []

Это означает: соединить список [] (0 элементов) в месте [:] (все индексы от начала до конца)

[:] - это оператор среза. Дополнительную информацию см. В этом вопросе.

person Adam Batkin    schedule 09.09.2009
comment
Почему не просто alist = []? - person mitenka; 09.02.2017
comment
@mitenka, которая не очищает список, она перезаписывает переменную alist другим списком, который оказывается пустым. Если у кого-то еще была ссылка на исходный список, он остается как есть (т.е. он содержит все, что было в нем с самого начала) - person Adam Batkin; 13.02.2017
comment
@mitenka Другая причина в том, что alist.clear() или alist[:] = [] помогают проверить, что alist действительно является списком. Допустим, вы получили alist, возвращенное функцией foo(). Вы думали, что foo вернул список, но на самом деле он вернул None. Использование alist = [] не может обнаружить эту ошибку. - person aafulei; 06.09.2019
comment
Я наткнулся на этот пост, потому что искал способ очистить список или, по крайней мере, думал, что это то, что мне нужно сделать. Я собирал данные и хотел создать подсписки на основе условия и поместить подсписки в главный список. Естественно, когда я использовал любой из методов удаления, он удалял подсписок и список, который я добавлял в главный список. Предложение Митеньки было именно тем, что мне было нужно. Подумав об этом, мне не нужно было очищать подсписок, мне нужно было сбросить его обратно на новый список ... Для меня было неочевидно, что это то, что мне нужно. Предложение Митеньки решило мою проблему. - person Thomas Johnson; 27.06.2020

оказывается, что с python 2.5.2 del l[:] немного медленнее, чем l[:] = [] на 1,1 мкс.

$ python -mtimeit "l=list(range(1000))" "b=l[:];del b[:]"
10000 loops, best of 3: 29.8 usec per loop
$ python -mtimeit "l=list(range(1000))" "b=l[:];b[:] = []"
10000 loops, best of 3: 28.7 usec per loop
$ python -V
Python 2.5.2
person Dan D.    schedule 23.11.2011
comment
В Python 2.7.2 на моей машине они примерно такие же. Оба они работают от 13,5 до 13,7 мксек за цикл. - person leetNightshade; 08.11.2012
comment
Вы также должны измерить python3 -mtimeit l = list (range (1000)) b = l [:], чтобы вычислить b [:] = [] и del b [:]. Сделай это и лол ... - person rockdaboot; 05.02.2016
comment
Я провел тест на python 3.5 и согласен с leetNightshade. .clear(), del b[:] и b[:]=[] работают одинаково (b[:]=[] немного медленнее. - person Conchylicultor; 13.03.2017

lst *= 0

имеет тот же эффект, что и

lst[:] = []

Это немного проще и, возможно, легче запомнить. Кроме этого нечего сказать

КПД вроде примерно такой же

person Ivan Hoffmann    schedule 23.03.2018
comment
Для полноты картины стоит упомянуть, что любое заданное целое число, меньшее или равное 0, будет иметь такой же эффект. Это довольно изящный трюк, мне немного грустно, что он не получил особого внимания ... - person Peter Varo; 24.05.2018

list = []

сбросит list в пустой список.

Обратите внимание, что обычно вы не должны скрывать зарезервированные имена функций, такие как list, который является конструктором для объекта списка - вместо этого вы можете использовать, например, lst или list_.

person Mark Rushakoff    schedule 09.09.2009
comment
Нет: это не изменит список, это просто присвоит пустой список переменной list. Если вы ожидали, что функция изменит переданный список (например), это не сделает того, что вы хотите. - person Adam Batkin; 09.09.2009
comment
Не совсем. Вопрос в том, как очистить список, а не как назначить переменную, содержащую список - person Adam Batkin; 09.09.2009
comment
вопрос не был двусмысленным, фрагмент операции выскакивал элементы из списка (вот и все, модифицируя его на месте) ... - person fortran; 09.09.2009
comment
+1 к Адаму Баткину, на мой взгляд, действительно хороший комментарий. Я приму ответ fortran, даже если подумал, что используя метод while / pop, я могу в конечном итоге отладить то, что уходит !!! - person DrFalk3n; 09.09.2009
comment
Кроме того, список не следует использовать в качестве имени переменной, поскольку он затеняет тип списка. Многие разработчики Python используют L в качестве имени переменной списка, но я предпочитаю lst. - person steveha; 11.09.2009
comment
Не следует ли удалить этот ответ, поскольку он вводит в заблуждение? - person Werner; 06.05.2016
comment
Иногда нужно просто очистить список, и это не хуже любого из предложенных методов. Возможно даже быстрее - person smac89; 22.05.2016
comment
Я зашел на эту страницу, чтобы очистить существующий список. Естественно, это первое, что я пробовал, но, как отмечали люди, это не сработало. Это просто создает новый список, и теперь ваша переменная указывает на новый список. Ваш существующий список не изменяется. Я пошел с list.clear(). - person akinuri; 15.01.2019

Еще один простой код, который вы можете использовать (в зависимости от вашей ситуации):

index=len(list)-1

while index>=0:
    del list[index]
    index-=1

Вы должны начать индекс по длине списка и идти назад по сравнению с индексом с 0, вперед, потому что в результате вы получите индекс, равный длине списка, при этом он будет разрезан только пополам.

Также убедитесь, что в строке while есть знак «больше или равно». Если вы его не укажете, у вас останется список [0].

person Donald    schedule 12.08.2014
comment
изобретать колесо с кубом - person Pedro Lobito; 25.11.2016
comment
Ха-ха. Это второй странный ответ (+ соответствующий комментарий), с которым я столкнулся на SO. Должен быть сайт для этих памятных вещей: D - person akinuri; 15.01.2019