Salta al contenuto
Note per Studenti Variabili, oggetti e riferimenti

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:

  1. valuta l'espressione a destra, ottenendo un oggetto;
  2. lega il nome x a quell'oggetto (creando il nome se non esiste).
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

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:

python
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):

python
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

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

  • a == b: i valori sono uguali.
  • a is b: sono lo stesso oggetto (stessa identità).
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).

Teoria collegata