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.
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) [:]
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 !):
@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
Python2.5.2
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.
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) é:
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.
Respostas:
Na verdade, isso remove o conteúdo da lista, mas não substitui o rótulo antigo por uma nova lista vazia:
Aqui está um exemplo:
Por uma questão de integridade, a atribuição de fatia tem o mesmo efeito:
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ávellst
, mas a lista antiga ainda terá os mesmos elementos e o efeito será aparente se houver outras ligações de variáveis.fonte
Se você estiver executando Python 3.3 ou melhor, você pode usar o
clear()
método delist
, que é paralela àclear()
dedict
,set
,deque
e outros tipos de contêineres mutável: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 !):
alist.clear() # Python 3.3+
del alist[:]
alist[:] = []
alist *= 0
fonte
Você poderia tentar:
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.
fonte
alist = []
?alist
por 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)alist.clear()
oualist[:] = []
ajuda a verificar sealist
realmente é uma lista. Digamos que vocêalist
retornou de uma funçãofoo()
. Você pensou quefoo
retornou uma lista, mas na verdade ela retornou aNone
. Usaralist = []
não pode pegar esse erro.verifica-se que, com o python 2.5.2,
del l[:]
é um pouco mais lento quel[:] = []
em 1.1 usec.fonte
.clear()
,del b[:]
Eb[:]=[]
todas as corridas o mesmo (b[:]=[]
sendo um pouco mais lento.tem o mesmo efeito que
É 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
fonte
0
teria o mesmo efeito. É um truque muito arrumado, porém, estou um pouco triste, que não recebeu muita atenção ..redefinirá
list
para 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 usarlst
oulist_
substituir, por exemplo.fonte
list
. Se você esperava que uma função modificasse uma lista passada (por exemplo), isso não faria o que você deseja.Outro código simples que você pode usar (dependendo da sua situação) é:
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.
fonte