Diferentes maneiras de limpar listas

208

Existe alguma razão para fazer algo mais complicado do que uma dessas duas linhas quando você deseja limpar uma lista no Python?

old_list = []
old_list = list()

A razão pela qual pergunto é que acabei de ver isso em algum código em execução:

del old_list[ 0:len(old_list) ]
johannix
fonte
1
Por que você está fazendo isso? Obras de coleta de lixo. Por que não simplesmente ignorar o antigo valor da lista e deixar o Python limpá-lo automaticamente?
1250 S.Lott
40
@ S.Lott: O pôster não escreveu o código e está perguntando por que o escritor original pode ter feito isso.
12119 John Fouhy
1
Você também pode fazer: while l: l.pop ()
RoadieRich
12
RI MUITO. Tenho certeza que isso é eficiente.
FogleBird
18
Não está relacionado à sua pergunta, mas você não deve usar len ao especificar uma fatia. a[:x]significa começar x e a[x:]significa x terminar. a[ 0:len(a) ]pode ser escrito como a[:]. Você também pode usar negativos para contar a partir do final ( a[-1]é o último elemento).
Idbrii 23/02

Respostas:

357

Limpar uma lista no local afetará todas as outras referências da mesma lista.

Por exemplo, este método não afeta outras referências:

>>> a = [1, 2, 3]
>>> b = a
>>> a = []
>>> print(a)
[]
>>> print(b)
[1, 2, 3]

Mas este faz:

>>> a = [1, 2, 3]
>>> b = a
>>> del a[:]      # equivalent to   del a[0:len(a)]
>>> print(a)
[]
>>> print(b)
[]
>>> a is b
True

Você também pode fazer:

>>> a[:] = []
Koba
fonte
87
Você também pode fazerdel a[:]
idbrii 23/02
1
Por que o primeiro afetará apenas a? Eu pensei ae breferência ao mesmo objeto ... Só quero saber o porquê. Obrigado.
Alston
38
Com o python 3.3 e posterior, você pode ir a.clear(), sem problemas!
Marek Lewandowski
4
@Stallman porque, primeiro, você está alterando uma referência para 'a' para apontar para uma nova matriz, não limpando uma, eb ainda aponta para uma antiga
Pax0r
4
Seria ótimo se alguém pudesse mostrar a diferença de desempenho entre esses métodos!
Suanmeiguo 24/07/2015
37

Fazer alist = []não limpa a lista, apenas cria uma lista vazia e a vincula à variável alist. A lista antiga ainda existirá se tivesse outras ligações de variáveis.

Para realmente limpar uma lista no local , você pode usar qualquer uma destas maneiras:

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

Consulte a página de documentação Tipos de sequência mutável para obter mais detalhes.

Eugene Yarmash
fonte
2
Eu testei e alist * = 0 é o mais rápido, o próximo mais rápido é alist.clear () e outros dois métodos são igualmente rápidos. Você poderia explicar por que alist * = 0 é o mais rápido?
21919 Jenny
3
@ Jenny: Simplesmente usa menos opcodes (ou menos caros) sob o capô. Por exemplo, a versão do operador não precisa procurar nomes de métodos ou criar fatias.
Eugene Yarmash
"Deve haver uma - e preferencialmente apenas uma - maneira óbvia de fazê-lo." Python está brilhando aqui :)
Nik O'Lai
36

Existe uma maneira muito simples de limpar uma lista python. Use del list_name [:] .

Por exemplo:

>>> a = [1, 2, 3]
>>> b = a
>>> del a[:]
>>> print a, b
[] []
NixMan
fonte
13

Parece-me que del devolverá a memória, enquanto atribuir uma nova lista fará com que a antiga seja excluída apenas quando o gc executar.matter.

Isso pode ser útil para listas grandes, mas para listas pequenas deve ser insignificante.

Edit : Como Algorias, não importa.

Observe que

del old_list[ 0:len(old_list) ]

é equivalente a

del old_list[:]
atormentado
fonte
2
gc não é executado em ciclos. A lista é liberada assim que sua última referência é descartada.
Algorias
2
Algorias: isso é verdade para o CPython, mas pode não ser para outras implementações.
mhsmith
2
del old_list [0: len (old_list)] e del old_list [:] têm um mesmo resultado, mas o último é mais rápido (verificado em Python 2.6)
Roy Nieterau
6
del list[:] 

Exclui os valores dessa variável de lista

del list

Exclui a própria variável da memória

ytpillai
fonte
5

Há dois casos em que você pode querer limpar uma lista:

  1. Você deseja usar o nome old_listainda mais no seu código;
  2. Você deseja que a lista antiga seja coletada como lixo o mais rápido possível para liberar alguma memória;

No caso 1, você apenas continua com a atribuição:

    old_list = []    # or whatever you want it to be equal to

No caso 2, a delinstrução reduziria a contagem de referência ao objeto da lista para o qual o nome old listaponta. Se o objeto da lista for apontado apenas pelo nome old_list, a contagem de referência será 0 e o objeto será liberado para coleta de lixo.

    del old_list
Alex
fonte
3

Se você estiver limpando a lista, obviamente não precisará mais da lista. Nesse caso, você pode excluir a lista inteira simplesmente pelo método del.

a = [1, 3, 5, 6]
del a # This will entirely delete a(the list).

Mas, se você precisar novamente, poderá reinicializá-lo. Ou simplesmente limpe seus elementos

del a[:]
lavee_singh
fonte
-4

outra solução que funciona bem é criar uma lista vazia como uma lista vazia de referência.

empt_list = []

por exemplo, você tem uma lista como a_list = [1,2,3]. Para limpar, faça o seguinte:

a_list = list(empt_list)

isso fará a_listuma lista vazia como a empt_list.

Mounir Ben
fonte
Não há razão para criar empt_list. Basta usar a_list = list ().
Daniel Harding