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)