Это выглядит так "грязно", опустошая список таким образом:
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] останется.