3.1 Oggetti, valori e tipi

Gli oggetti sono delle astrazioni di Python per i dati. Tutti i dati in Python vengono rappresentati da oggetti o da relazioni tra oggetti. (In un certo senso, e conformemente al modello di Von Neumann di ``stored program computer'', anche il codice viene rappresentato come un oggetto).

Ogni oggetto ha un'identità, un tipo ed un valore. L'identità di un oggetto non cambia mai dopo che è stato creato; potete pensare a questa come l'indirizzo di memoria dell'oggetto. L'operatore `is' confronta l'identità di 2 oggetti; la funzione id() restituisce un intero che rappresenta l'identità dell'oggetto (attualmente implementato come il suo indirizzo). Il tipo di un oggetto è anch'esso immutabile.3.1 Il tipo di un oggetto determina le operazioni che l'oggetto supporta (per esempio, ``è possibile determinarne la lunghezza?'') e definisce anche i possibili valori per gli oggetti di quel tipo. La funzione type() restituisce il tipo dell'oggetto (che è a sua volta un oggetto). Il valore di alcuni oggetti può cambiare. Gli oggetti il cui valore può cambiare vengono detti mutabili; gli oggetti il cui valore non può cambiare vengono detti immutabili. (Il valore di un oggetto contenitore immutabile che contiene un riferimento ad un oggetto mutabile può cambiare quando cambia il valore di quest'ultimo; comunque il contenitore viene ancora considerato immutabile, poiché la collezione di oggetti che contiene non può essere cambiata. Perciò immutabile non è strettamente equivalente ad un valore non modificabile, la differenza è più sottile). La mutabilità di un oggetto viene determinata dal suo tipo; per esempio numeri, stringhe e tuple sono immutabili, mentre dizionari e liste sono mutabili.

Gli oggetti non vengono mai esplicitamente distrutti; comunque, quando diventano irrangiungibili, possono essere distrutti tramite il Garbage collector. All'implementazione viene concesso di posticipare il garbage collector oppure ometterlo totalmente, il modo in cui opera il Garbage Collector è una questione di qualità dell'implementazione, finché non viene raccolto un oggetto che è ancora raggiungibile. Nota implementativa: l'implementazione corrente utilizza uno schema di conteggio dei riferimenti che (facoltativamente) ritarda l'intercettazione di oggetti non più referenziati, ma non garantisce di intercettare le dipendenze cicliche. Vedere la Libreria Python di riferimento per informazioni sul controllo del garbage collector per dipendenze cicliche.

Notare che l'utilizzo dell'implementazione delle facility di tracing e debugging può mantenere vivi oggetti che normalmente sarebbero riciclabili. Notare anche che l'intercettazione di un'eccezione con l'istruzione `try...except' può tenere in vita un oggetto.

Alcuni oggetti contengono riferimenti a risorse ``esterne'' come file aperti o finestre. Bisogna comprendere che queste risorse vengono liberate quando l'oggetto viene riciclato tramite il GC, ma poiché nulla garantisce che il GC intervenga, questi oggetti forniscono anche un metodo esplicito per rilasciare le risorse esterne, generalmente un metodo close(). Ai programmi è caldamente raccomandato chiudere questi oggetti. L'istruzione `try...finally' fornisce un modo conveniente per farlo.

Alcuni oggetti contengono riferimenti ad altri oggetti; questi vengono chiamati contenitori. Sono esempi di contenitori tuple, liste e dizionari. Questi riferimenti sono parte del valore del contenitore. In molti casi, quando parliamo del valore del contenitore, implichiamo il valore, non l'identità degli oggetti contenuti; comunque, quando parliamo di mutabilità di un contenitore, viene implicata solo l'identità dell'oggetto immediatamente contenuto. Perciò, se un contenitore immutabile (come una tupla) contiene un riferimento ad un oggetto mutabile, il suo valore può cambiare se cambia questo oggetto mutabile.

I tipi coinvolgono quasi tutti gli aspetti del comportamento di un oggetto. Anche l'importanza dell'identità degli oggetti ne viene coinvolta in qualche modo: per i tipi immutabili, le operazioni che computano nuovi valori possono in realtà restituire un riferimento ad un oggetto esistente con lo stesso valore, mentre per gli oggetti mutabili non è ammesso. Per esempio, dopo "a = 1; b = 1", a e b possono fare riferimento allo stesso oggetto con il valore uno, a seconda dell'implementazione, ma dopo "c = []; d = []" è garantito che c e d faranno riferimento a due liste differenti, uniche e vuote (notare invece che "c = d = []" assegna lo stesso oggetto a c e d).



Footnotes

... immutabile.3.1
Da Python 2.2, è iniziato un graduale lavoro di unificazione di tipi e classi, che rendono alcune delle affermazioni in questo manuale non accurate al 100% ed incomplete: per esempio, adesso è possibile, in alcuni casi, cambiare il tipo di un oggetto, sotto alcune condizioni controllate. Finché questo manuale non subirà un'intensa revisione, deve essere considerato come autoritativo solo circa le ``classi classiche'', che sono ancora il comportamento predefinito, per ragioni di compatibilità, in Python 2.2 e 2.3.
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.