Variabili, oggetti e riferimenti
In questa pagina 7
In questa pagina 5
Oggetti
Definizione (oggetto in Python: tipo, identità e valore). Ogni dato in Python è un oggetto con:
- tipo (
type(x)): determina valori possibili e operazioni ammesse; non cambia;- identità (
id(x)): di fatto l'indirizzo in memoria; non cambia;- valore: può cambiare solo se l'oggetto è mutabile.
Esempio. x = [1, 2] ha tipo list; x.append(3) ne cambia il valore (mutabile) ma non l'identità: id(x) resta lo stesso.
Variabili come nomi
Definizione (assegnamento e variabile come nome). Una variabile è un nome che si riferisce a un oggetto, non una "scatola" con il valore dentro. L'assegnamento
x = espressione:
- valuta l'espressione a destra, ottenendo un oggetto;
- lega il nome
xa quell'oggetto (creando il nome se non esiste).
Esempio. Dopo x = 10 e y = x, x is y vale True: i due nomi si riferiscono allo stesso oggetto.
x = 10
x = "dieci" # lecito: tipizzazione dinamica, ora x si riferisce a una str
y = x # y e x si riferiscono allo STESSO oggettoLe variabili non si dichiarano. Usare un nome mai assegnato dà NameError.
Forme di assegnamento
a = b = 0 # stesso oggetto a due nomi
a, b = 1, 2 # assegnamento multiplo (spacchettamento di una tupla)
a, b = b, a # scambio senza variabile temporanea
n += 1 # assegnamento aumentato: n = n + 1Python non ha ++ e --.
Mutabili e immutabili
Definizione (oggetti mutabili e immutabili)
Immutabili Mutabili int,float,bool,complex,str,tuple,frozenset,Nonelist,dict,set, oggetti di classi definite dall'utente (di norma)Con un immutabile, ogni "modifica" crea un nuovo oggetto e rilega il nome:
s = "ciao" t = s s += "!" # nuovo oggetto "ciao!"; t è ancora "ciao"
Esempio. s = "ciao"; t = s; s += "!" lascia t == "ciao" e s == "ciao!", perché str è immutabile.
Definizione (aliasing). Con un mutabile, la modifica avviene sul posto ed è visibile da tutti i nomi che si riferiscono all'oggetto (aliasing):
a = [1, 2, 3] b = a # alias, non copia b.append(4) print(a) # [1, 2, 3, 4] c = a.copy() # copia (superficiale): oggetto diverso
Esempio. a = [1, 2]; b = a; b.append(3) rende a == [1, 2, 3].
Dettagli sulle copie in Liste in Pythonlist come sequenza mutabile (array dinamico); indici, slicing e assegnamento a fette; metodi e loro costo; aliasing, copia superficiale e profonda; list comprehension; liste annidate e matrici.Liste in Python →.
== e is
Definizione (== e is)
a == b: i valori sono uguali.a is b: sono lo stesso oggetto (stessa identità).
Esempio. Con a = [1, 2] e b = [1, 2]: a == b vale True, a is b vale False.
a = [1, 2]; b = [1, 2]
a == b, a is b # (True, False)is si usa quasi solo per confrontare con None: if x is None:. Non usarlo per numeri o stringhe: il risultato dipende da ottimizzazioni interne dell'interprete.
None
None (tipo NoneType) rappresenta "nessun valore". È ciò che restituisce una funzione senza return (vedi Funzioni in Pythondef e return, parametri posizionali, con nome e con valore predefinito, *args e **kwargs; passaggio per riferimento a oggetto; ambito delle variabili LEGB; docstring, type hint, lambda.Funzioni in Python →).
Garbage collection
Quando un oggetto non è più raggiungibile da alcun nome, l'interprete libera la memoria da solo (conteggio dei riferimenti + raccoglitore dei cicli). In C questo lavoro è del programmatore: Gestione della memoria in CSegmenti di memoria di un processo (codice, dati statici, stack, heap); durata delle variabili; allocazione dinamica con malloc, calloc, realloc e free; errori classici: memory leak, dangling pointer, double free, buffer overflow; strumenti di controllo.Gestione della memoria in C →.
Errori tipici
b = apensando di copiare una lista: si crea un alias.- Usare
isal posto di==tra numeri o stringhe. - Scrivere
x == 5(confronto) volendox = 5(assegnamento), o viceversa dentro unif(lì=è errore di sintassi).
Versione ripasso
Oggetti e Variabili
Ogni dato è un oggetto con:
- tipo (
type(x)): non cambia; - identità (
id(x)): indirizzo in memoria; - valore: cambia solo se l'oggetto è mutabile.
Una variabile è un nome che si riferisce a un oggetto (tipizzazione dinamica). Usare un nome non assegnato genera NameError.
Mutabili e Immutabili
| Immutabili | Mutabili |
|---|---|
int, float, bool, complex, str, tuple, frozenset, None |
list, dict, set, classi utente |
- Immutabili: la modifica crea un nuovo oggetto e rilega il nome.
- Mutabili: la modifica avviene sul posto (aliasing:
b = aconalista non copia,b.append(4)cambia anchea). Per una copia superficiale si usa.copy(), vedi Liste in Pythonlist come sequenza mutabile (array dinamico); indici, slicing e assegnamento a fette; metodi e loro costo; aliasing, copia superficiale e profonda; list comprehension; liste annidate e matrici.Liste in Python →.
== e is
a == b: i valori sono uguali.a is b: sono lo stesso oggetto (id(a) == id(b)). Usareisquasi solo conNone.
None e Garbage collection
None(NoneType) rappresenta "nessun valore" (valore di ritorno di funzioni senzareturn, vedi Funzioni in Pythondef e return, parametri posizionali, con nome e con valore predefinito, *args e **kwargs; passaggio per riferimento a oggetto; ambito delle variabili LEGB; docstring, type hint, lambda.Funzioni in Python →).- La Garbage collection libera automaticamente la memoria quando un oggetto non è più raggiungibile (in C la gestione è manuale: Gestione della memoria in CSegmenti di memoria di un processo (codice, dati statici, stack, heap); durata delle variabili; allocazione dinamica con malloc, calloc, realloc e free; errori classici: memory leak, dangling pointer, double free, buffer overflow; strumenti di controllo.Gestione della memoria in C →).
Errori tipici
- Usare
b = aper copiare una lista (crea un alias). - Usare
isanziché==per numeri o stringhe.