Salta al contenuto
Note per Studenti Variabili, oggetti e riferimenti

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:

  1. valuta l'espressione a destra, ottenendo un oggetto;
  2. lega il nome x a 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.

python
x = 10
x = "dieci"        # lecito: tipizzazione dinamica, ora x si riferisce a una str
y = x              # y e x si riferiscono allo STESSO oggetto

Le variabili non si dichiarano. Usare un nome mai assegnato dà NameError.

Forme di assegnamento

python
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 + 1

Python non ha ++ e --.

Mutabili e immutabili

Definizione (oggetti 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"

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.

python
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 = a pensando di copiare una lista: si crea un alias.
  • Usare is al posto di == tra numeri o stringhe.
  • Scrivere x == 5 (confronto) volendo x = 5 (assegnamento), o viceversa dentro un if (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

== e is

  • a == b: i valori sono uguali.
  • a is b: sono lo stesso oggetto (id(a) == id(b)). Usare is quasi solo con None.

None e Garbage collection

Errori tipici

  • Usare b = a per copiare una lista (crea un alias).
  • Usare is anziché == per numeri o stringhe.

Esercizi su questo argomento

Teoria collegata