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


356

Это выглядит так "грязно", опустошая список таким образом:

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

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


28
Так почему же у Python-диктов и наборов есть метод clear (), а не списки?
— работа

13
Но если есть несколько ссылок на объект, это может быть полезно.
— Нед Дейли

3
Это может быть полезно, если мне нужно очистить общий список по процессам во время выполнения и не нужно ждать обработки мусора (или я ошибаюсь? Я неправильно понял сборку мусора?). Также, если я хочу проверить каждый извлеченный элемент, я могу отладить его, пока не могу использовать нарезку (или я ошибаюсь). Мне не нужно останавливать выполнение процесса при очистке моего списка.
— DrFalk3n

2
@ S.Lott Тот факт, что вы не понимаете, почему это важно, не означает, что мы не понимаем этого. Если несколько объектов зависят от общего списка, это будет иметь значение. В некоторых моделях дизайна это важно. Сборщик мусора означает, что вам не нужно убирать за собой; это не лицензия, чтобы делать больше беспорядка.
— UpAndAdam

4
Несмотря на любые другие, лучшие ответы, ваш исходный код мог быть написан: while alist: alist.pop ()
— MrWonderful

Ответы:


570

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

del lst[:]

Вот пример:

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

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

lst[:] = []

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

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


3
Еще два вопроса: что такое «del»? (Я делаю вывод, что это делает вещи, но я действительно не знаю, что это) и 2-е: Как вы читаете (вслух) [:]
— OscarRyz


14
Я обычно не зачитываю вслух код на python xD, но если бы мне пришлось, я бы сказал: «отрывок от начала до конца списка l».
— Фортран

2
@jellybean совершенно непреднамеренно ^ _ ^ Английский не мой родной язык, поэтому я действительно не заметил разницы между этими двумя комментариями.
— Фортран

если мы сделаем l = [], не получит ли старый список содержимое мусора, собранного Python GC?
— Алекс Пуннен,

169

Если вы используете Python 3.3 или выше, вы можете использовать clear()метод 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

6
Этот ответ должен быть на вершине, что не так с stackoverflow!
— BreakBadSP

Ясно () лучше.
— sailfish009

61

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

alist[:] = []

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

[:] Является оператором среза. Смотрите этот вопрос для получения дополнительной информации.


4
Почему не просто alist = []?
— митенка

16
@mitenka, который не очищает список, он перезаписывает переменную alistдругим списком, который оказывается пустым. Если у кого-то еще была ссылка на первоначальный список, он остается как есть (то есть содержит то, что было в нем для начала)
— Адам Баткин

@mitenka Другая причина в том, что alist.clear()или alist[:] = []помогает проверить, что это alistдействительно список. Скажем, вы alistвернулись из функции foo(). Вы думали, что fooвернули список, но на самом деле он вернул None. Использование alist = []не может поймать эту ошибку.
— aafulei

32

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

$ 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

1
В Python 2.7.2 на моей машине они примерно одинаковы. Они оба работают от 13.5-13.7 usec за цикл.
— leetNightshade

Вы также должны измерить python3 -mtimeit "l = list (range (1000))" "b = l [:]", чтобы вычислить "b [:] = []" и "del b [:]". Сделай это и LOL ...
— Rockdaboot

1
Я сделал тест с Python 3.5, и я согласен с leetNightshade. .clear(), del b[:]И b[:]=[]все работает , так же ( b[:]=[]будучи немного медленнее.
— Conchylicultor

5
lst *= 0

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

lst[:] = []

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

Эффективность кажется примерно одинаковой


1
Для полноты картины стоит отметить, что любое заданное целое число, меньшее или равное, 0будет иметь тот же эффект. Хотя это довольно изящный трюк, мне немного грустно, что он не привлек к себе большого внимания ..
— Питер Варо

-1
list = []

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

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


38
Нет: это не изменит список, это просто назначит пустой список переменной list. Если вы ожидаете, что функция модифицирует переданный список (например), это не будет делать то, что вы хотите.
— Адам Баткин

10
На самом деле, нет. Вопрос «Как очистить список», а не «Как назначить переменную, содержащую список»
— Адам Баткин

6
вопрос не был двусмысленным, фрагмент опа выталкивал элементы из списка (вот и все, изменяя его на месте) ...
— Fortran

7
Кроме того, «список» не должен использоваться в качестве имени переменной, потому что это тень типа «список». Многие разработчики Python используют «L» в качестве имени переменной списка, но я предпочитаю «lst».
— Steveha

1
Иногда вы просто хотите очистить список, и это так же хорошо, как любой из предложенных методов. Вероятно, даже быстрее
— smac89

-3

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

index=len(list)-1

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

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

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


15
заново изобретать колесо с кубом
— CONvid19

Ха - ха. Это второй странный ответ (+ соответствующий комментарий), с которым я столкнулся на SO. Там должен быть сайт для этих памятных вещей: D
— akinuri
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.