Como esvaziar uma lista?


356

Parece tão "sujo" esvaziando uma lista desta maneira:

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

Existe uma maneira clara de fazer isso?


28
Então, por que python dicts e sets têm um método clear (), mas não listas?
job

13
Mas se houver várias referências ao objeto, pode ser útil.
Ned Deily

3
Pode ser útil se eu precisar limpar uma lista compartilhada dos processos em tempo de execução e não precisar esperar pelo lixo (ou estou errado? Entendi mal a coleta de lixo?). Além disso, se eu quiser verificar cada elemento popped, posso depurá-lo enquanto não posso usar o fatiamento (ou estou errado). Não preciso interromper a execução do processo ao limpar minha lista.
DrFalk3n 10/09/09

2
@ S.Lott Só porque você não entende por que isso é importante, não significa que o resto de nós não. Se vários objetos dependem de uma lista comum, isso será importante. Em vários padrões de design, isso é importante. Coletor de lixo significa que você não precisa se limpar; não é uma licença para fazer mais bagunça.
UpAndAdam

4
Não obstante quaisquer outras, respostas melhores, o código inicial poderia ter sido escrito: enquanto alist: alist.pop ()
MrWonderful

Respostas:


570

Na verdade, isso remove o conteúdo da lista, mas não substitui o rótulo antigo por uma nova lista vazia:

del lst[:]

Aqui está um exemplo:

lst1 = [1, 2, 3]
lst2 = lst1
del lst1[:]
print(lst2)

Por uma questão de integridade, a atribuição de fatia tem o mesmo efeito:

lst[:] = []

Também pode ser usado para reduzir uma parte da lista enquanto substitui uma parte ao mesmo tempo (mas isso está fora do escopo da pergunta).

Observe que fazer lst = []não esvazia a lista, apenas cria um novo objeto e o vincula à variável lst, mas a lista antiga ainda terá os mesmos elementos e o efeito será aparente se houver outras ligações de variáveis.


3
Duas perguntas adicionais: O que é "del" exatamente? (Eu deduzi-la del-etes coisas, mas eu realmente não sei o que é isso) e 2: Como você lida (em voz alta) [:]
OscarRyz

2
Para uma explicação som de del, eu consulte os docs: docs.python.org/reference/simple_stmts.html#the-del-statement
fortran

14
Normalmente não leio em voz alta o código python xD, mas, se fosse necessário, acho que diria "fatia do começo ao fim da lista l".
FORTRAN

2
@jellybean completamente involuntário ^ _ ^ O inglês não é minha língua materna, então eu realmente não notei o contraste entre os dois comentários.
fortran

se fizermos l = [], o conteúdo antigo da lista não será coletado como lixo pelo Python GC?
Alex Punnen 15/03

168

Se você estiver executando Python 3.3 ou melhor, você pode usar o clear()método de list, que é paralela à clear()de dict, set, dequee outros tipos de contêineres mutável:

alist.clear()  # removes all items from alist (equivalent to del alist[:])

De acordo com a página de documentação vinculada, o mesmo também pode ser alcançado com alist *= 0.

Para resumir, existem quatro maneiras equivalentes de limpar uma lista no local (muito contrário ao Zen do Python !):

  1. alist.clear() # Python 3.3+
  2. del alist[:]
  3. alist[:] = []
  4. alist *= 0

6
Esta resposta deve estar no topo, o que há de errado com o stackoverflow!
BreakBadSP

clear () é melhor.
usar o seguinte

61

Você poderia tentar:

alist[:] = []

O que significa: Emenda na lista [](0 elementos) no local [:](todos os índices do início ao fim)

O [:] é o operador de fatia. Veja esta pergunta para mais informações.


4
Por que não apenas alist = []?
Mitenka

16
@mitenka que não esvazia a lista, substitui a variável alistpor uma lista diferente que por acaso está vazia. Se alguém teve uma referência à lista original, que permanece como está (ou seja, ele contém tudo o que estava nele para começar)
Adam Batkin

@mitenka Outra razão é essa alist.clear()ou alist[:] = []ajuda a verificar se alistrealmente é uma lista. Digamos que você alistretornou de uma função foo(). Você pensou que fooretornou uma lista, mas na verdade ela retornou a None. Usar alist = []não pode pegar esse erro.
aafulei

32

verifica-se que, com o python 2.5.2, del l[:]é um pouco mais lento que l[:] = []em 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

11
No Python 2.7.2, na minha máquina, eles são praticamente os mesmos. Ambos executam de 13,5 a 13,7 usec por loop.
precisa saber é o seguinte

Você também deve medir python3 -mtimeit "l = lista (intervalo (1000))" "b = l [:]" para calcular "b [:] = []" e "del b [:]". Fazê-lo e lol ...
rockdaboot

11
Fiz o benchmark com python 3.5 e concordo com leetNightshade. .clear(), del b[:]E b[:]=[]todas as corridas o mesmo ( b[:]=[]sendo um pouco mais lento.
Conchylicultor

5
lst *= 0

tem o mesmo efeito que

lst[:] = []

É um pouco mais simples e talvez mais fácil de lembrar. Fora isso, não há muito a dizer

A eficiência parece ser a mesma


11
Por uma questão de exaustividade, vale a pena mencionar que qualquer número inteiro menor ou igual a 0teria o mesmo efeito. É um truque muito arrumado, porém, estou um pouco triste, que não recebeu muita atenção ..
Peter Varo

-1
list = []

redefinirá listpara uma lista vazia.

Observe que você geralmente não deve ocultar nomes de funções reservadas, como list, que é o construtor de um objeto de lista - você pode usar lstou list_substituir, por exemplo.


38
Não: isso não vai modificar a lista, isso só atribui uma lista vazia para a variável list. Se você esperava que uma função modificasse uma lista passada (por exemplo), isso não faria o que você deseja.
Adam Batkin

10
Na verdade não. A pergunta é "Como esvaziar uma lista" e não "Como atribuir mais de uma variável que contém uma lista"
Adam Batkin

6
a questão não era ambígua, trecho da op foi surgindo elementos fora da lista (é isso, modificando-o no lugar) ...
fortran

7
Além disso, "lista" não deve ser usada como um nome de variável, porque está sombreado do tipo "lista". Muitos desenvolvedores de Python usam "L" como um nome de variável de lista, mas eu prefiro "lst".
steveha

11
Às vezes, você só quer que a lista seja esvaziada e isso é tão bom quanto qualquer um dos métodos propostos. Provavelmente ainda mais rápido
smac89

-3

Outro código simples que você pode usar (dependendo da sua situação) é:

index=len(list)-1

while index>=0:
    del list[index]
    index-=1

Você precisa iniciar o índice no comprimento da lista e retroceder em relação ao índice em 0, para a frente, porque isso resultaria em um índice igual ao comprimento da lista, com apenas o corte pela metade.

Além disso, verifique se a linha while possui um sinal "maior que ou igual a". Se omitir, você deixará a lista [0] restante.


15
reinventando a roda com um cubo
CONvid19

Haha Esta é a segunda resposta estranha (+ um comentário apropriado) que eu encontrei no SO. Deveria haver um site para essas coisas memoráveis: D
akinuri 15/01/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.