Различные способы очистки списков


159

Есть ли причина сделать что-нибудь более сложное, чем одна из этих двух строк, когда вы хотите очистить список в Python?

old_list = [] 
old_list = list() 

Я спрашиваю, что я только что видел это в какой-либо запущенной код:

del old_list[ 0:len(old_list) ] 
+1

Зачем вы это делаете? Работает сборник мусора. Почему бы просто не игнорировать значение старого списка и позволить Python автоматически его очистить? 12 май. 092009-05-12 02:15:37

+32

@ S.Lott: плакат не написал код и спрашивает, почему автор оригинала мог это сделать. 12 май. 092009-05-12 03:20:59

+14

Не связано с вашим вопросом, но вы не должны использовать len при указании среза. 'a [: x]' означает начало x и 'a [x:]' означает x для завершения. 'a [0: len (a)]' может быть записано как 'a [:]'. Вы также можете использовать негативы для подсчета с конца ('a [-1]' - последний элемент). 23 фев. 112011-02-23 20:53:51

+1

Вы также можете сделать: while l: l.pop() 13 май. 092009-05-13 02:10:35

+9

LOL. Я уверен, что это эффективно. 13 май. 092009-05-13 02:17:07

+1

Никто ничего не сказал, так как это было эффективно ... 13 май. 092009-05-13 03:11:52

303

Очистка списка на месте будет влиять на все другие ссылки из того же списка.

Например, этот метод не влияет на другие ссылки:

>>> a = [1, 2, 3] 
>>> b = a 
>>> a = [] 
>>> print(a) 
[] 
>>> print(b) 
[1, 2, 3] 

Но это делает:

>>> a = [1, 2, 3] 
>>> b = a 
>>> del a[:]  # equivalent to del a[0:len(a)] 
>>> print(a) 
[] 
>>> print(b) 
[] 
>>> a is b 
True 

Вы также можете сделать:

>>> a[:] = [] 
+6

Хмм, вы узнаете что-то новое каждый день. 12 май. 092009-05-12 02:05:32

+80

Вы также можете сделать 'del a [:]' 23 фев. 112011-02-23 20:51:16

+1

Почему первый влияет только на 'a'? Я думал, что «a» и «b» ссылается на тот же объект ... Просто хочу знать, почему. Благодарю. 22 ноя. 142014-11-22 09:48:11

+20

С ** python 3.3 ** и позже вы можете пойти с 'a.clear()', без проблем! 06 дек. 142014-12-06 16:20:51

+4

@Stallman, потому что сначала вы меняете ссылку для 'a', чтобы указать на новый массив, не очищая его, а b все еще указывает на старое. 04 фев. 152015-02-04 14:36:34

+4

Было бы здорово, если бы кто-нибудь мог показать разницу в производительности между этими методами! 24 июл. 152015-07-24 20:40:29


11

Оказывается для меня, что del даст вам память назад, а присвоение нового списка сделает старый удаляется только при запуске gc runs.matter.

Это может быть полезно для больших списков, но для небольшого списка оно должно быть незначительным.

Редактировать: Как Альгориас, это не имеет значения.

Обратите внимание, что

del old_list[ 0:len(old_list) ] 

эквивалентно

del old_list[:] 
+2

gc не запускается циклами. Список освобождается, как только его последняя ссылка будет удалена. 12 май. 092009-05-12 04:45:55

+2

Algorias: это верно для CPython, но может и не быть для других реализаций. 18 дек. 112011-12-18 23:48:20

+1

del old_list [0: len (old_list)] и del old_list [:] имеют одинаковый результат, но последний быстрее (отмечен в Python 2.6) 12 фев. 132013-02-12 14:38:10


4

Есть два случая, в которых вы могли бы хотеть, чтобы очистить список:

  1. Вы хотите использовать имя old_list далее в вашем коде;
  2. Вы хотите, чтобы старый список был собран как можно скорее, чтобы освободить память;

В случае 1 вы просто идти дальше с распайкой:

old_list = [] # or whatever you want it to be equal to 

В случае 2 del заявления позволит сократить количество ссылок на список объект указаны имя old list точки на. Если объект списка указывается только именем old_list, счетчик ссылок будет равен 0, и объект будет освобожден для сбора мусора.

del old_list 

30

Существует очень простой способ удалить список python. Используйте del list_name [:].

Например:

>>> a = [1, 2, 3]` 
>>> b = a 
>>> del a[:] 
>>> print a, b 
[] [] 

3
del list[:] 

удалим значения этого списка переменных

del list 

будет удалить саму переменную из памяти


1

Если вы очищая список , вам, очевидно, больше не нужен этот список. Если это так, вы можете просто удалить весь список простым методом del.

a = [1, 3, 5, 6] 
del a # This will entirely delete a(the list). 

Но в случае, если это необходимо, вы можете повторно инициализировать его. Или просто просто очистите его элементы от

del a[:] 

-1

Другое решение, которое прекрасно работает, - это создать пустой список в качестве ссылочного пустого списка.

empt_list = [] 

например, у вас есть список a_list = [1,2,3]. Для того, чтобы очистить это просто сделать следующее:

a_list = list(empt_list) 

это сделает a_list пустой список так же, как empt_list.


2

Чтобы очистить список на месте в Python 3.3+ вы можете также использовать list.clear(), что согласуется с интерфейсами других изменяемых контейнеров (например, dict, set или deque).

old_list.clear() # removes all items from old_list (same as del old_list[:])