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