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.




(fractions_is)

Sebbene myfraction e yourfraction contengano lo stesso numeratore e denominatore, non sono lo stesso oggetto.

../_images/fractionpic2.png

Se assegniamo myfraction a ourfraction, allora le due variabili sono alias dello stesso oggetto.

../_images/fractionpic3.png

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.




(fractions_eq1)

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.

Next Section - Metodi Aritmetici