Uguaglianza¶
La parola uguaglianza sembra chiara ma può dare adito a diverse fraintendimenti.
Per esempio, se diciamo “Chris e io abbiamo la stessa macchina”, vogliamo dire che il modello e il colore è lo stesso e non che la macchina è condivisa. Se diciamo “Chris e io abbiamo la stessa madre”, vogliamo dire che la madre è la stessa.
La stessa ambiguità sussiste tra oggetti. Per esempio, se due frazioni sono uguali vuol dire che sono lo stesso oggetto o che contengono dati che sono uguali?
Questa ambiguità è risolta dall’operatore is
(già visto per le liste), che ci permette di capire se due variabili si riferiscono allo stesso oggetto.
Sebbene myfraction
e yourfraction
contengano lo stesso numeratore e denominatore, non sono lo stesso oggetto.
Se assegniamo myfraction
a ourfraction
, allora le due variabili sono alias dello stesso oggetto.
Questo tipo di uguaglianza è detta shallow equality (uguaglianza superficiale) perchè confronta solo i riferimenti e non il contenuto degli oggetti. Gli oggetti Fraction
sono uguali (==) se si riferiscono allo stesso oggetto.
Possiamo definire metodi che controllano l’uguaglianza del valore di due frazioni, come segue.
def sameFraction(f1, f2):
return (f1.getNum() == f2.getNum()) and (f1.getDen() == f2.getDen())
Questo tipo di uguaglianza è chiamata deep equality (uguaglianza profonda) dal momento che confronta i valori e non i riferimenti.
Se c’è uguaglianza superficiale allora c’è anche uguaglianza profonda.
Stiamo attenti a ==
Il significato di == dipende da chi ha lo ha programmato (specificato nella documentazione della classe). Alcune volte significa uguaglianza profonda e altre superficiale, come mostrato nell’esempio seguente.
p = Point(4, 2)
s = Point(4, 2)
print("== on Points returns", p == s) # by default, == does a shallow equality test here
a = [2, 3]
b = [2, 3]
print("== on lists returns", a == b) # by default, == does a deep equality test on lists
L’output è:
== on Points returns False
== on lists returns True
Dunque concludiamo che anche se le due liste sono oggetti distinti con diversi indirizzi di memoria, in un caso l’operatore ==
controlla l’uguaglianza profonda, mentre nel caso dei punti controlla l’uguaglianza superficiale.