1
resposta

Como fazer para não alterar o dict dados?

def km_media(dataset, ano_atual):
  result={}
  dadosCopia = dict.copy(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
1 resposta

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:

Duas células do Google Colab nas cores cinza, onde a primeira célula possui o dicionário dados e a função criada pelo aluno, o resultado dessa célula é o dicionário proveniente da função. A segunda célula está apenas apresentando o conteúdo do dicionário dados

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.

Diagrama com 3 retângulos na cor verde claro. O primeiro retângulo superior possui o conteúdo {1: L} onde a letra L está destacada por um círculo amarelo. Esse retângulo está seguido por uma seta marrom apontando para o segundo retângulo com uma lista contendo os números 1, 2 e 3. O retângulo inferior possui o conteúdo {1: M} onde a letra M está destacada por um círculo amarelo. Esse retângulo está seguido por uma seta marrom apontando para o segundo retângulo com uma lista contendo os números 1, 2 e 3

  • b = copy.deepcopy(a): Cópia profunda de a e b, onde a estrutura e o conteúdo ficam completamente isolados.

Diagrama com 3 retângulos na cor verde claro. O primeiro retângulo superior possui o conteúdo {1: L} onde a letra L está destacada por um círculo amarelo. Esse retângulo está seguido por uma seta marrom apontando para o segundo retângulo com uma lista contendo os números 1, 2 e 3. O retângulo inferior possui o conteúdo {1: M} onde a letra M está destacada por um círculo amarelo. Esse retângulo está seguido por uma seta marrom apontando para o quarto retângulo com uma lista contendo os números 1, 2 e 3

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!

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