Oi, Roberto! Basicamente, o que acontece é que nas linhas recibo3 = None
e recibo3 = recibo2
não estamos modificando o valor do objeto referenciado no nome recibo3
, mas atribuindo outro objeto a este nome. É, pode parecer um pouco confuso hehehe, mas vamos tentar destrinchar um pouco:
As três primeiras linhas são claras, criamos três objetos do tipo Recibo
diferentes e os referenciamos em três variáveis diferentes (recibo1
, recibo2
e recibo3
). A coisa começa na quarta linha:
recibo4 = recibo3
O que estamos fazendo nessa linha? Nesse caso, realmente é o que parece - estamos linkando esse nome (recibo4
) ao objeto que já estava sendo referenciado pela variável recibo3
. Olha só, se imprimirmos os identificadores dos objetos referenciados por essas variáveis na memória:
>>> recibo 4 = recibo3
>>> id(recibo3)
100
>>> id(recibo4)
100
Independente de ser 100
ou não, os dois são iguais - as duas variáveis apontam para o mesmo objeto. O que é importante de entendermos nesse ponto é que o nome recibo4
e recibo3
não tem ligação em si! As duas variáveis apontam para o mesmo objeto, mas não há nada ligando os dois nomes em si. Assim, chegamos nessa linha:
recibo3 = None
Agora, o que estamos fazendo? Pode parecer que estamos mudando o objeto para o qual recibo3
estava referenciado, mas não é o caso! O que estamos fazendo é justamente deixando de referenciar esse objeto com essa variável, e apontando-a para um novo objeto de tipo None
. Vamos ver os identificadores agora:
>>> recibo3 = None
>>> id(recibo3)
101
>>> id(recibo4)
100
Aquele objeto de antes ainda existe, e continua sendo referenciado pela variável recibo4
(lembra que os nomes não tinham relação entre si?). A única diferença é que, agora, recibo3
não aponta mais para ela, e sim para um objeto None
. Passando para a próxima linha:
recibo1 = recibo3
Estamos fazendo o mesmo que fizemos lá em cima - referenciando à variável recibo1
o mesmo objeto referenciado pela variàvel recibo3
. Os ids:
>>> recibo1 = recibo3
>>> id(recibo1)
101
>>> id(recibo3)
101
Novamente, os nomes recibo1
e recibo3
não estão ligados, mas simplesmente apontam para o mesmo objeto None
. Em seguida:
recibo4 = recibo1
Passamos como referência para a variável recibo4
o mesmo objeto apontado pela variável recibo1
, ou seja, None
. Vamos ver de novo os ids:
>>> recibo4 = recibo1
>>> id(recibo1)
101
>>> id(recibo4)
101
Finalmente, na última linha:
recibo3 = recibo2
Novamente mudamos a referência da variável recibo3
. O objeto None
, que antes ela referenciava, continua lá (e recibo1
continua apontando para ele!), mas recibo3
deixa de apontar para ele e passa a apontar para o mesmo objeto que recibo2
aponta. Os ids, agora:
>>> recibo3 = recibo2
>>> id(recibo1)
101
>>> id(recibo2)
99
>>> id(recibo3)
99
>>> id(recibo4)
101
Ao final, temos recibo1
e recibo4
apontando para o mesmo None
e recibo2
e recibo3
apontando para o mesmo Recibo(100)
.