Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Por que recibo1 igual a None?

O recibo1 estava apontando para o recibo3. No momento da referenciação, o 3 tinha o valor None, porém na última linha o recibo3 foi referenciado para o recibo2, com valor 100. Logo todos passam a valer 100, não?

No fim todos os recibos acabam referenciados no 2:

recibo4 > recibo1> recibo3> recibo2 = 100

2 respostas
solução!

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).

Mais bem explicado que isso, só dois disso.