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) ]

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[:] = []

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.


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
[] []

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[:]

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


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

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[:]

-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.


Não há razão para criar empt_list. Basta usar a_list = list ().
Daniel Harding
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.