LinuxLudus: R: Python-domande varie

Federico Ramponi federico.ramponi@gmail.com
Gio 22 Maggio 2008 19:51:34 CEST


> Anche lui aveva problemi (se parliamo del LUG verona a San Pietro in
> Cariano), perche' non capiva perche':
>
> s1 = "stringa"
> s2 = "stringa"
>
> s1 == s2 (cioe' era la stessa oggetto stringha, e non due oggetti
> stringhe con lo stesso valore)
>
Azz.
Andiamo con ordine. Calma e sangue freddo.

In python vengono definiti gli operatori "==" e "is". Il primo (a ==
b) ritorna True se le due variabili confrontate si riferiscono ad
oggetti "uguali", in un qualche senso naturale di uguaglianza. Il
secondo (a is b) ritorna True se le variabili confrontate sono _lo
stesso oggetto_, la stessa istanza in memoria.

L'esempio nelle slide e` questo:
s1 = "   Python   "
s2 = s1[3:9]
s3 = s1.strip()
s2 == s3    # Vero, le due stringhe sono uguali (entrambe "Python")
s2 is s3    # Falso, sono oggetti distinti

Ora, e` assolutamente ovvio che due stringhe che sono composte dagli
stessi identici caratteri risultino uguali (nel senso di ==). Riguardo
a questo non ho e non avevo alcun problema.

Ma perche' nella presentazione ho scelto volutamente questo esempio
artificiale e incasinato? Il motivo e` che in quest'altro esempio,
quello che avevo scelto di primo acchito:
s1 = "Python"
s2 = "Python"
s1 == s2    # Ovviamente vero
s1 is s2    # VERO!!
in cui teoricamente e "moralmente" s1 e s2 dovrebbero essere oggetti
uguali ma _distinti_, di fatto s1 ed s2 risultano essere _lo stesso
oggetto_, cioe` la stessa stringa in memoria.
La cosa mi ha un po' sorpreso, e ne abbiamo concluso che l'interprete
Python e` sufficientemente intelligente da chiedersi, nel secondo
assegnamento, "se per caso" la stringa che sto assegnando e` gia`
stata istanziata in qualche occasione (si`! All'istruzione
precedente), e "in questo caso" riutilizzarla per non sprecare
memoria. Il fatto che le stringhe siano sequenze immutabili e`
garanzia della possibilita` di riutilizzarle senza problemi.

Si tratta solo di un dettaglio tecnico, io non insisterei troppo su
questo esempio.

ciao,
r.


Maggiori informazioni sulla lista linuxludus