Так почему же у Python-диктов и наборов есть метод clear (), а не списки?
работа
13
Но если есть несколько ссылок на объект, это может быть полезно.
Нед Дейли
3
Это может быть полезно, если мне нужно очистить общий список по процессам во время выполнения и не нужно ждать обработки мусора (или я ошибаюсь? Я неправильно понял сборку мусора?). Также, если я хочу проверить каждый извлеченный элемент, я могу отладить его, пока не могу использовать нарезку (или я ошибаюсь). Мне не нужно останавливать выполнение процесса при очистке моего списка.
DrFalk3n
2
@ S.Lott Тот факт, что вы не понимаете, почему это важно, не означает, что мы не понимаем этого. Если несколько объектов зависят от общего списка, это будет иметь значение. В некоторых моделях дизайна это важно. Сборщик мусора означает, что вам не нужно убирать за собой; это не лицензия, чтобы делать больше беспорядка.
UpAndAdam
4
Несмотря на любые другие, лучшие ответы, ваш исходный код мог быть написан: while alist: alist.pop ()
MrWonderful
Ответы:
570
Это фактически удаляет содержимое из списка, но не заменяет старый ярлык новым пустым списком:
del lst[:]
Вот пример:
lst1 =[1,2,3]
lst2 = lst1del lst1[:]print(lst2)
Для полноты назначения среза имеет тот же эффект:
lst[:]=[]
Его также можно использовать для сокращения части списка при одновременной замене части (но это выходит за рамки вопроса).
Обратите внимание, что выполнение lst = []не очищает список, а просто создает новый объект и привязывает его к переменной lst, но старый список будет по-прежнему иметь те же элементы, и эффект будет очевиден, если у него будут другие привязки переменных.
Я обычно не зачитываю вслух код на 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 !):
@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 -VPython2.5.2
Для полноты картины стоит отметить, что любое заданное целое число, меньшее или равное, 0будет иметь тот же эффект. Хотя это довольно изящный трюк, мне немного грустно, что он не привлек к себе большого внимания ..
Питер Варо
-1
list =[]
сбросится listв пустой список.
Обратите внимание, что вы обычно не должны скрывать зарезервированные имена функций, такие как list, который является конструктором для объекта списка - вы можете использовать его lstили list_вместо него, например.
Нет: это не изменит список, это просто назначит пустой список переменной list. Если вы ожидаете, что функция модифицирует переданный список (например), это не будет делать то, что вы хотите.
Адам Баткин
10
На самом деле, нет. Вопрос «Как очистить список», а не «Как назначить переменную, содержащую список»
Адам Баткин
6
вопрос не был двусмысленным, фрагмент опа выталкивал элементы из списка (вот и все, изменяя его на месте) ...
Fortran
7
Кроме того, «список» не должен использоваться в качестве имени переменной, потому что это тень типа «список». Многие разработчики Python используют «L» в качестве имени переменной списка, но я предпочитаю «lst».
Steveha
1
Иногда вы просто хотите очистить список, и это так же хорошо, как любой из предложенных методов. Вероятно, даже быстрее
smac89
-3
Другой простой код, который вы можете использовать (в зависимости от вашей ситуации):
Вы должны начать индексирование с длины списка и перейти назад к индексу с 0, вперёд, потому что это приведет к тому, что индекс будет равен длине списка, а его урежут только пополам.
Также убедитесь, что строка while имеет знак «больше или равно». Если вы пропустите его, список [0] останется.
Ответы:
Это фактически удаляет содержимое из списка, но не заменяет старый ярлык новым пустым списком:
Вот пример:
Для полноты назначения среза имеет тот же эффект:
Его также можно использовать для сокращения части списка при одновременной замене части (но это выходит за рамки вопроса).
Обратите внимание, что выполнение
lst = []
не очищает список, а просто создает новый объект и привязывает его к переменнойlst
, но старый список будет по-прежнему иметь те же элементы, и эффект будет очевиден, если у него будут другие привязки переменных.источник
Если вы используете Python 3.3 или выше, вы можете использовать
clear()
методlist
, который параллеленclear()
изdict
,set
,deque
и других типов изменяемых контейнеров:Согласно связанной странице документации, то же самое может быть достигнуто с
alist *= 0
.Чтобы подвести итог, есть четыре эквивалентных способа очистить список на месте (совершенно противоположно дзен Python !):
alist.clear() # Python 3.3+
del alist[:]
alist[:] = []
alist *= 0
источник
Вы можете попробовать:
Что означает: сращивание в списке
[]
(0 элементов) на месте[:]
(все индексы от начала до конца)[:] Является оператором среза. Смотрите этот вопрос для получения дополнительной информации.
источник
alist = []
?alist
другим списком, который оказывается пустым. Если у кого-то еще была ссылка на первоначальный список, он остается как есть (то есть содержит то, что было в нем для начала)alist.clear()
илиalist[:] = []
помогает проверить, что этоalist
действительно список. Скажем, выalist
вернулись из функцииfoo()
. Вы думали, чтоfoo
вернули список, но на самом деле он вернулNone
. Использованиеalist = []
не может поймать эту ошибку.Оказывается, что с Python 2.5.2,
del l[:]
немного медленнее, чемl[:] = []
на 1.1 usec.источник
.clear()
,del b[:]
Иb[:]=[]
все работает , так же (b[:]=[]
будучи немного медленнее.имеет тот же эффект, что и
Это немного проще и, возможно, легче запомнить. Кроме этого, сказать особо нечего
Эффективность кажется примерно одинаковой
источник
0
будет иметь тот же эффект. Хотя это довольно изящный трюк, мне немного грустно, что он не привлек к себе большого внимания ..сбросится
list
в пустой список.Обратите внимание, что вы обычно не должны скрывать зарезервированные имена функций, такие как
list
, который является конструктором для объекта списка - вы можете использовать егоlst
илиlist_
вместо него, например.источник
list
. Если вы ожидаете, что функция модифицирует переданный список (например), это не будет делать то, что вы хотите.Другой простой код, который вы можете использовать (в зависимости от вашей ситуации):
Вы должны начать индексирование с длины списка и перейти назад к индексу с 0, вперёд, потому что это приведет к тому, что индекс будет равен длине списка, а его урежут только пополам.
Также убедитесь, что строка while имеет знак «больше или равно». Если вы пропустите его, список [0] останется.
источник