1
resposta

Copiar Lista - COPIA RASA E COPIA PROFUNDA - DEEPCOPY

Tudo bem!

Duvidas sobre deepcopy (do texto: "Como fazer uma cópia de uma lista no Python" - https://www.alura.com.br/artigos/como-fazer-copia-de-lista-python):

  • O deepcopy cria novos objetos (ID) para cada elemento, separando uma lista da outra
  • No exemplo do texto tem um elemento ('Certificação PHP') que permanece com a mesma ID em duas listas, mesmo utilizando o deepcopy

O exemplo abaixo segue o mesmo padrão do exemplo do texto

  • tem uma lista dentro de lista
  • tem um elemento que permanece com a mesma ID em listas diferentes (nesse exemplo é o 'B_vol1'), utilizando tanto o .copy() como o deepcopy
  • Se o deepcopy cria novos objetos (ID) na nova lista, porque 'B_vol1' possui a mesma ID em listas diferentes?
  • No exemplo abaixo, ao utilizar o "livros_yan[1].remove('B_vol1')", 'B_vol1' é removido de "livros_yan" e de "livros_gil", mas não é removido de "livros_pedro"; ok! o deepcopy funcionou, porém funcionou em um elemento com a mesma ID em listas diferentes
from copy import deepcopy

# livros A, [B_vol1, B_vol2], C
livros_yan = [['A'], ['B_vol1', 'B_vol2'], ['D']]
livros_gil = livros_yan.copy()
livros_pedro = deepcopy(livros_yan)

print("L_01" + "=" * 20)
# ID para livros_yan (ex.: 2003186526912)
print("ID lista LIVROS YAN:", id(livros_yan))
# .copy() gera um nova ID para livros_gil (ex.: 2003186527552)
print("ID lista LIVROS GIL:", id(livros_gil))
# deepcopy gera um nova ID para livros_pedro (ex.: 2003186527296)
print("ID lista LIVROS PEDRO:", id(livros_pedro))

print("\nL_02" + "=" * 20)
# ID LIVRO [B_vol1, B_vol2] igual YAN (ex.: 2003186350400) e GIL (ex.: 2003186350400), 
# POREM difere para PEDRO (ex.: 2003186526976)
print("ID LIVRO [B_vol1, B_vol2] YAN:", id(livros_yan[1]))
print("ID LIVRO [B_vol1, B_vol2] GIL:", id(livros_gil[1]))
print("ID LIVRO [B_vol1, B_vol2] PEDRO:", id(livros_pedro[1]))
# ID B_vol1 igual para YAN, GIL e também PEDRO (ex.: 2003186037296 para os tres)
print("ID B_vol1 YAN:", id(livros_yan[1][0]))
print("ID B_vol1 GIL:", id(livros_gil[1][0]))
print("ID B_vol1 PEDRO:", id(livros_pedro[1][0]))

print("\nL_03" + "=" * 20)
# remove apenas o B_vol1
livros_yan[1].remove('B_vol1')
# B_vol1 será removido de Yan e Gil, porem permanece em Pedro
# deepcopy fez seu papel de nao remover B_vol1 para Pedro
print("LIVROS YAN SEM B_vol1:", livros_yan)
print("LIVROS GIL SEM B_vol1:", livros_gil)
print("LIVROS PEDRO:", livros_pedro)
1 resposta

"Se o deepcopy cria novos objetos (ID) na nova lista, porque 'B_vol1' possui a mesma ID em listas diferentes?" Acredito que o ID do 'B_vol1' não mude porque 'str' já é um valor imutável, como é o mesmo objeto('B_vol1'), ele aponta para a mesma referencia na memoria em todas as listas...

o mesmo caso ocorre a baixo, o id das variaveis t1 e t2 são os mesmos, mas mudar uma delas nao afeta a outra porque elas sao imutaveis. Se eu deletar t1 ou modificar o valor, o id de t1 vai mudar, mas o objeto 'teste' vai continuar na memoria.

t1='teste'
t2='teste'
print(id(t1),id(t2),sep='\n')

Não sei se consegui explicar bem =D

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software