2015-05-28 28 views
5

Vedo domande esistenti relative a linguaggi di programmazione specifici. Esistono differenze di implementazione in lingue specifiche, ma esiste una differenza concettuale teorica?C'è una differenza tra una lista e una tupla?

Mutevole vs immutabile: In Python, le liste sono completamente mutabili mentre le tuple sono immutabili o persistente immutabile in modo che le modifiche creano nuove tuple e non fanno in atto modifiche. Ma questo è puramente un dettaglio di implementazione. In altre lingue le tuple sono mutabili e le liste sono immutabili.

Eterogeneo vs omogeneo: Semanticamente, le tuple sono in genere eterogenee, mentre le liste sono solitamente omogenee, ma questa è più una convenzione e ci sono molte eccezioni. I linguaggi tipizzati dinamicamente come Python hanno liste eterogenee. Haskell, ad esempio, ha il supporto per elenchi eterogenei completamente tipizzati staticamente chiamati HList.

Finite vs Infinite: In teoria, un elenco può essere infinito e alcuni linguaggi di programmazione (Haskell) supportano elenchi infiniti. Una tupla non può essere infinita.

UPDATE: L'unica differenza teorica è che una tupla deve essere finita, mentre una lista può teoricamente essere infinita. Il resto delle differenze sono puramente differenze di implementazione.

Wikipedia dice "Una tupla è un elenco di elementi finito limitato".

Questo rende chiaro che una tupla è una lista, ma una lista finita.

+0

In quale lingua (s) è la mutabilità il contrario? –

+0

Gli elenchi e le tuple in C++ sono entrambi modificabili. – StilesCrisis

+0

Puoi spostare questa domanda su http://cs.stackexchange.com/ – StilesCrisis

risposta

2

Da una prospettiva C#, la differenza più evidente sarebbe che le tuple sono di lunghezza fissa per tutta la durata della loro esistenza, mentre le liste supportano l'aggiunta e la rimozione di funzionalità che potrebbero causare la modifica delle loro lunghezze.

Si potrebbe obiettare che questa è solo una decisione arbitraria di implementazione, ma questo riconduce al problema della mutevolezza. Supponiamo di avere un Tuple<double, double> per rappresentare un punto 2D. Se rimuovo uno degli elementi, quindi ho Tuple<double>, è chiaro che questo non è più un punto 2D e il significato originale anche della dimensione rimanente è probabilmente non più rilevante o utilizzabile.

Se, tuttavia, avevo uno List<double> che rappresenta i punteggi di 2 studenti e ne rimuovo uno, ora ho un elenco di 1 punteggio dello studente. Ma il doppio rimanente è ancora un punteggio e conserva ancora il pieno significato/rilevanza di un punteggio.

In breve, vedo gli elementi di tupla come attributi o dimensioni (di solito il set di definizione minimo richiesto), mentre vedo gli elementi di elenco come istanze arbitrarie.

+0

C++ è molto simile a questo proposito. Puoi concatenare tuple con 'tuple_cat', ma in realtà è solo creando una nuova tupla con un nuovo tipo. – StilesCrisis

+0

La prima differenza è l'immutabilità semplice. In C#, come Python o Scala, le tuple sono immutabili per impostazione predefinita. È possibile aggiungere/rimuovere elementi, ma ciò crea una nuova tupla e mantiene l'originale invariato. La seconda distinzione è puramente semantica. Se si dispone di un elenco di punteggi dei test, la maggior parte di essi utilizza una lista, ma è possibile utilizzare una tupla – clay

1

Matematicamente, una tupla potrebbe essere un elenco di elementi e quindi anche un elenco, ma non conosco le specifiche della tupla e dell'elenco in quel dominio. Da un punto di vista della programmazione vedo una differenza semantica che è che la lista è un contenitore per elementi e la tupla è un oggetto che rappresenta dati multidimensionali (ad esempio punti 2D o 3D). Quindi non useresti una tupla per salvare un elenco di elementi. Invece si usa una tupla per rappresentare dati multidimensionali.

+0

Un punto 2D/3D è un elenco di coordinate. Una tupla è sempre una lista di elementi. – clay