Это выглядит так "грязно", опустошая список таким образом:
while len(alist) > 0 : alist.pop()
Существует ли четкий способ сделать это?
Это выглядит так "грязно", опустошая список таким образом:
while len(alist) > 0 : alist.pop()
Существует ли четкий способ сделать это?
Ответы:
Это фактически удаляет содержимое из списка, но не заменяет старый ярлык новым пустым списком:
del lst[:]
Вот пример:
lst1 = [1, 2, 3]
lst2 = lst1
del lst1[:]
print(lst2)
Для полноты назначения среза имеет тот же эффект:
lst[:] = []
Его также можно использовать для сокращения части списка при одновременной замене части (но это выходит за рамки вопроса).
Обратите внимание, что выполнение lst = []
не очищает список, а просто создает новый объект и привязывает его к переменной lst
, но старый список будет по-прежнему иметь те же элементы, и эффект будет очевиден, если у него будут другие привязки переменных.
Если вы используете Python 3.3 или выше, вы можете использовать clear()
метод list
, который параллелен clear()
из dict
, set
, deque
и других типов изменяемых контейнеров:
alist.clear() # removes all items from alist (equivalent to del alist[:])
Согласно связанной странице документации, то же самое может быть достигнуто с alist *= 0
.
Чтобы подвести итог, есть четыре эквивалентных способа очистить список на месте (совершенно противоположно дзен Python !):
alist.clear() # Python 3.3+
del alist[:]
alist[:] = []
alist *= 0
Вы можете попробовать:
alist[:] = []
Что означает: сращивание в списке []
(0 элементов) на месте [:]
(все индексы от начала до конца)
[:] Является оператором среза. Смотрите этот вопрос для получения дополнительной информации.
alist = []
?
alist
другим списком, который оказывается пустым. Если у кого-то еще была ссылка на первоначальный список, он остается как есть (то есть содержит то, что было в нем для начала)
alist.clear()
или alist[:] = []
помогает проверить, что это alist
действительно список. Скажем, вы alist
вернулись из функции foo()
. Вы думали, что foo
вернули список, но на самом деле он вернул None
. Использование alist = []
не может поймать эту ошибку.
Оказывается, что с 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
.clear()
, del b[:]
И b[:]=[]
все работает , так же ( b[:]=[]
будучи немного медленнее.
lst *= 0
имеет тот же эффект, что и
lst[:] = []
Это немного проще и, возможно, легче запомнить. Кроме этого, сказать особо нечего
Эффективность кажется примерно одинаковой
0
будет иметь тот же эффект. Хотя это довольно изящный трюк, мне немного грустно, что он не привлек к себе большого внимания ..
list = []
сбросится list
в пустой список.
Обратите внимание, что вы обычно не должны скрывать зарезервированные имена функций, такие как list
, который является конструктором для объекта списка - вы можете использовать его lst
или list_
вместо него, например.
list
. Если вы ожидаете, что функция модифицирует переданный список (например), это не будет делать то, что вы хотите.
Другой простой код, который вы можете использовать (в зависимости от вашей ситуации):
index=len(list)-1
while index>=0:
del list[index]
index-=1
Вы должны начать индексирование с длины списка и перейти назад к индексу с 0, вперёд, потому что это приведет к тому, что индекс будет равен длине списка, а его урежут только пополам.
Также убедитесь, что строка while имеет знак «больше или равно». Если вы пропустите его, список [0] останется.