Схоже, так "брудно" спорожнення списку таким чином:
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].