Oii Luis, tudo bem contigo?
Peço desculpas pela demora em dar um retorno.
Para fazer uma cópia de um dicionário pode ser utilizado o método copy
, conforme você utilizou na linha dadosCopia = dict.copy(dataset)
ou também assim dadosCopia = dataset.copy()
. Esse processo de cópia é importante quando desejamos fazer algumas alterações mas sem ser diretamente no dicionário original.
No entanto, se formos testar seu código, e visualizar o dataframe dados
após a aplicação da função, vamos perceber que ele continua sendo alterado:
Isso está acontecendo porque ao utilizar o método copy
em um dicionário que possui outros dicionários, está sendo realizada uma cópia rasa.
Uma cópia rasa de uma coleção é uma cópia da estrutura dessa coleção e não dos elementos. Com uma cópia rasa, as duas coleções vão compartilhar seus elementos individuais.
Todavia, existem as cópias profundas deepcopy
. Essas duplicam tudo. Uma cópia profunda de uma coleção é composta com todos os elementos da coleção original duplicados.
Abaixo, vou colocar duas imagens de exemplo que podem te ajudar e visualizar melhor essas situações:
b = a.copy()
: Cópia rasa: a e b se tornarão dois objetos isolados, mas seus conteúdos compartilham da mesma referência de memória.
b = copy.deepcopy(a)
: Cópia profunda de a e b, onde a estrutura e o conteúdo ficam completamente isolados.
Dessa forma, para que o dicionário original dados
não seja alterado, precisamos utilizar o método deepcopy
da biblioteca copy
, da seguinte maneira:
import copy
dados = {
'Crossfox': {'km': 35000, 'ano': 2005},
'DS5': {'km': 17000, 'ano': 2015},
'Fusca': {'km': 130000, 'ano': 1979},
'Jetta': {'km': 56000, 'ano': 2011},
'Passat': {'km': 62000, 'ano': 1999}
}
def km_media(dataset, ano_atual):
result={}
dadosCopia = copy.deepcopy(dataset)
for item in dadosCopia.items():
media = item[1]['km'] / (ano_atual - item[1]['ano'])
item[1].update({'km_media': media})
result.update({item[0]:item[1]})
return result
km_media(dados, 2019)
Assim, ao visualizar o dicionário dados
mesmo após a função, vamos perceber que ele não sofreu nenhuma alteração ^^
Parabéns pela proatividade de ir além e pesquisar sobre maneiras de copiar o dicionário para não fazer alterações no original. Mandou muito bem :)
Qualquer dúvida estou por aqui.
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!