Variabili, oggetti e riferimenti
In questa pagina 7
Oggetti
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.
Variabili come nomi
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).
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
| Immutabili | Mutabili |
|---|---|
int, float, bool, complex, str, tuple, frozenset, None |
list, 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"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 diversoDettagli 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
a == b: i valori sono uguali.a is b: sono lo stesso oggetto (stessa identità).
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).