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

356

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

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

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

DrFalk3n
источник
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
2
Для подробного
fortran
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