Enviar um café pro programador

Como Copiar uma Lista em Python

Neste tutorial de nosso Curso de Python, vamos aprender a maneira errada e a correta de se copiar uma lista.

Referenciando Listas - Copiando do jeito Errado

Vamos criar  a list1:
list1 = [1, 2, 3, 4]

O que acontece por trás dos planos é que existe um bloco de memória no seu computador, com a lista [1, 2, 3, 4] armazenado lá. A varável list1 tem um endereço que aponta para esse bloco de memória.

Agora vamos criar outra lista, a list2.
Fazendo uma cópia direta: list2 = list1

Agora faça um teste, mude um valor da list1, por exemplo:
list1[0] = 0

Agora a list1 será [0,2,3,4].
Porém, se você der um print em list2 vai ver que ela também é [0, 2, 3, 4]

Curso de Python online de graça.


Mas peraí Python!
Eu queria mudar só a list1! E não a list2.
Por que isso ocorre?

Simples, ao fazermos list2=list1, faremos com que list2 também aponte para aquele endereço de memória.

Então, se alterar o valor naquele bloco de memória, essa mudança vai ser visível para todas as variáveis que apontem para ĺa!


Copiando do Jeito Certo e Difícil

Uma solução para copiar corretamente é copiar item por item:

list2 = []
for item in list1:
    list2.append(item)

Copiando do Jeito Certo e Fácil

Ou uma solução ainda mais elegante:

list2 = [] + list1

O que fizemos foi concatenar a lista list1 com outra lista (vazia), e o resultado é uma cópia de list1, mas agora list2 não aponta para o mesmo bloco de memória.

Bacana copiar dessa maneira, não é?

3 comentários:

  1. Ou ainda numa solução mais elegante e simples com o operador :

    list1 = ['segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado', 'domingo']
    list2 = list1[:]

    ResponderExcluir
    Respostas
    1. Essa sua solução de fatiar lista não é elegante. Uma sintaxe estranha remete a uma logica estranha. Considerando boas práticas de programação não faz sentido usá-la nunca.

      Excluir
  2. Copiando do Jeito MAIS Certo e ainda MAIS Fácil com uma solução MAIS elegante ainda, seria utilizando o Deep Copy:

    list2 = list1.copy()

    ResponderExcluir