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


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.