2012-04-02 16 views
7

Ho saputo per un po 'che la differenza principale tra liste e tuple in Python è che le liste sono mutabili e le tuple no. Oltre a questo e ai diversi metodi a loro disposizione, so molto poco su liste e tuple. C'è qualche altra differenza tra loro? Ci sono qualsiasi vantaggi/svantaggi (oltre all'immutabilità) nell'usare una tupla su un elenco in Python 3? Si ha un tempo di accesso più veloce o una dimensione di memoria più piccola o più metodi rispetto all'altra? Le loro strutture interne sono in qualche modo diverse? O una tupla è solo una lista immutabile, niente di più?Differenza tra lista e tupla (meno immutabilità) in Python?

+0

possibile duplicato di [Qual è la differenza tra elenco e tuple?] (Http://stackoverflow.com/questions/626759/whats-the-difference-tra between-list-and-tuples) –

risposta

7

Entrambe le liste e le tuple sono implementate internamente come matrici di riferimenti agli oggetti elemento. In questo modo, entrambi possono essere indicizzati ed entrambi richiedono la stessa quantità di memoria per ciascun elemento. Internamente, sono entrambi omogenei (riferimenti non tipizzati). Logicamente, sono entrambi eterogenei (dereferenziazione automatica, il tipo è legato all'oggetto di destinazione).

L'elenco può essere modificato, quindi l'array interno è un array dinamico. La tupla non può essere modificata, quindi è internamente solo una matrice di dimensioni fisse. Da questo punto di vista, le tuple sono più semplici.

Per il quale è più veloce o meno, è possibile misurare la situazione concreta utilizzando il modulo timeit.

Si dovrebbe essere consapevoli del fatto che le tuple sono immutabili solo rispetto al numero e ai valori dei riferimenti memorizzati. Se (diciamo) una lista viene usata come uno degli elementi di tupla, il contenuto della lista può essere modificato. In questo modo, logicamente, il contenuto della tupla non è costante (tale tupla non è lavabile).

Utilizzare qualsiasi tipo è migliore per lo scopo. Non c'è una preferenza rigida. Dipende dalla situazione.

4

Esegui dir su entrambi: elenco di metodi piuttosto diverso (pop mostrato di seguito). tuple possono essere più veloce

>>> alist = [1,2,3] 
>>> atuple = (1,2,3) 
>>> alist.pop() 
3 
>>> atuple.pop() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'tuple' object has no attribute 'pop' 

'append', 'count', 'estendere', 'index', 'inserto', 'pop', 'rimuovere', 'inverso', 'specie' sono tutti disponibili per liste, e non per le tuple - il che ha senso, vista l'idea di immutabilità.

Filosoficamente, alcune persone si aspettano che le liste siano omogenee e non hanno questa aspettativa di tuple.

+0

Ci sono differenze interne in i tipi, come strucure o encoding? – fouric

+0

Se si intende la codifica delle stringhe, è irrilevante per le tuple. La codifica è solo un modo per convertire una stringa astratta in una sequenza concreta di byte. Quando la tupla contiene un elemento stringa, l'oggetto stringa viene creato al di fuori della tupla. L'elemento tupla si riferisce solo all'oggetto (riferimento non tipizzato). Questo è lo stesso con entrambi gli elementi tuple o list. – pepr