Як спорожнити список?


356

Схоже, так "брудно" спорожнення списку таким чином:

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

Чи існує чіткий спосіб зробити це?


28
То чому піктони та набори python мають чіткий () метод, але не списки?
робота

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
Для звукового пояснення дель пошлюся на документи: docs.python.org/reference/simple_stmts.html#the-del-statement
Фортран

14
Зазвичай я не читаю вголос код python xD, але якби мені довелося, я б сказав "фрагмент від початку до кінця списку l".
фортран

2
@jellybean абсолютно ненавмисна ^ _ ^ Англійська мова не є моєю рідною мовою, тому я дійсно не помітив контраст між двома коментарями.
фортран

якщо ми зробимо l = [], чи не буде вміст старого списку зібраний сміттям, зібраним Python GC?
Алекс Пуннен

168

Якщо ви використовуєте 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 = []?
mitenka

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 = список (діапазон (1000))" "b = l [:]" для обчислення "b [:] = []" і "del b [:]". Зроби це і
хаха

1
Я зробив орієнтир з python 3.5 і я згоден з leetNightshade. .clear(), del b[:]і b[:]=[]все працює так само ( b[:]=[]трохи повільніше.
Конхілікультор

5
lst *= 0

має такий же ефект, як і

lst[:] = []

Це трохи простіше і, можливо, простіше запам'ятати. Крім цього, сказати не багато

Ефективність здається приблизно однаковою


1
Для повноти варто зазначити, що будь-яке задане ціле число, яке менше або рівне 0, матиме однаковий ефект. Хоча це дуже акуратний трюк, мені трохи сумно, що він не приділяв багато уваги ..
Пітер Варо

-1
list = []

повернеться listдо порожнього списку.

Зауважте, що ви, як правило, не повинні затінювати зарезервовані імена функцій, наприклад list, що є конструктором об'єкта списку - ви можете використовувати, lstабо list_замість цього, наприклад.


38
Ні: це не змінить список, він просто призначає порожній список змінній list. Якщо ви очікували, що функція може змінити переданий список (наприклад), це не буде робити те, що ви хочете.
Адам Баткін

10
Не зовсім. Питання "Як виповнити список", а не "Як призначити змінну, яка містить список"
Адам Баткін

6
питання не було неоднозначним, фрагмент операційної системи вискакував елементи зі списку (це все, змінюючи його на місці) ...
fortran

7
Також "list" не слід використовувати як ім'я змінної, оскільки це тіні типу "list". Багато розробників 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.