Qual è la differenza tra liste e tuple?


1020

Qual è la differenza?

Quali sono i vantaggi / gli svantaggi delle tuple / liste?


13
Gli altri hanno risposto di seguito, ma vorrei sottolineare che, imho, python ha nomi di tipo di dati totalmente non intuitivi. Non penso che nessun'altra lingua abbia tuple (con quel nome) e, peggio ancora, come parola non riesco nemmeno a tradurlo nella mia lingua. Qualcuno sa da dove viene la "tupla"? Olandese?
Rook

98
Tuple è un termine di base in matematica, derivato dal latino (vedi Wikipedia).
nikow,

129
coppia -> tripla -> quadrupla -> quintupla -> sestupla -> um, come si chiama, ah zolla, 7-tupla -> 8-tupla -> ... da cui 'tupla' come nome generico.
John Fouhy,

31
@JohnFouhy Sono passati più di sei anni, ma: ... eptupla, ottupla, tupla con nove elementi, decupla, undecupla, dodecupla ...: D
Augusta,

18
@MegaWidget Pensavo che avessimo stabilito che una non coppia era un list. ; D
Augusta,

Risposte:


1017

Oltre alle immutabili tuple, esiste anche una distinzione semantica che dovrebbe guidarne l'uso. Le tuple sono strutture di dati eterogenee (ovvero, le loro voci hanno significati diversi), mentre gli elenchi sono sequenze omogenee. Le tuple hanno struttura, le liste hanno ordine.

L'uso di questa distinzione rende il codice più esplicito e comprensibile.

Un esempio potrebbe essere rappresentato dalle coppie di pagine e numero di riga per fare riferimento alle posizioni in un libro, ad esempio:

my_location = (42, 11)  # page number, line number

È quindi possibile utilizzare questo come chiave in un dizionario per memorizzare le note nelle posizioni. Un elenco d'altra parte potrebbe essere utilizzato per memorizzare più posizioni. Naturalmente si potrebbe desiderare di aggiungere o rimuovere posizioni dall'elenco, quindi ha senso che le liste siano mutabili. D'altra parte non ha senso aggiungere o rimuovere elementi da una posizione esistente, quindi le tuple sono immutabili.

Potrebbero verificarsi situazioni in cui si desidera modificare gli elementi all'interno di una tupla di posizione esistente, ad esempio quando si scorre tra le righe di una pagina. Ma l'immutabilità della tupla ti costringe a creare una nuova tupla di posizione per ogni nuovo valore. Ciò sembra inopportuno, ma l'utilizzo di dati immutabili come questo è una pietra miliare di tipi di valore e tecniche di programmazione funzionale, che possono avere vantaggi sostanziali.

Ci sono alcuni articoli interessanti su questo argomento, ad esempio "Le tuple Python non sono solo elenchi costanti" o "Comprensione delle tuple e degli elenchi in Python" . La documentazione ufficiale di Python menziona anche questo

"Le tuple sono immutabili e di solito contengono una sequenza eterogenea ...".

In un linguaggio tipicamente statico come Haskell i valori in una tupla generalmente hanno tipi diversi e la lunghezza della tupla deve essere fissa. In un elenco i valori hanno tutti lo stesso tipo e la lunghezza non è fissa. Quindi la differenza è molto evidente.

Infine c'è la tupla di nome in Python, che ha senso perché una tupla dovrebbe già avere una struttura. Ciò sottolinea l'idea che le tuple sono un'alternativa leggera a classi e istanze.


11
+1, specialmente per il tuo secondo link con un ottimo esempio. Adoro questa citazione: "Questa tupla funziona come un disco o una struttura leggera".
Baltimark,

105
"le liste sono sequenze omogenee" - Sono nuovo in Python, ma le liste non sono eterogenee? Da docs.python.org/py3k/tutorial/introduction.html : "Gli elementi dell'elenco non devono necessariamente avere tutti lo stesso tipo." Ma forse stai parlando del concetto formale e non del Python.
Matthew Cornell,

13
Un buon sinonimo semantico di "tupla" potrebbe essere "record". È una raccolta di elementi di dati correlati in una sequenza specifica. In effetti, penso che collections.namedtuplesarebbe meglio chiamarlo collections.record. Non avrebbe senso scambiare, per esempio, il nome e l'indirizzo in un record del cliente; infatti, farlo in genere sarebbe un errore, che l'immutabilità della tupla ti impedisce di commettere.
kindall

4
@nikow: Per quanto riguarda What would you do with such a list?, rabbrividisco sempre quando ppl usa la mancanza di fantasia come argomento. L'uso di elenchi di tipi misti funziona egregiamente, ad esempio per alcune strutture di dati gerarchiche, in cui ogni elenco è composto da liste figlio ed elementi valore.
Sebastian Mach,

18
Non è fuorviante affermare che le tuple sono eterogenee e le liste sono omogenee? Ad esempio, un elenco può contenere miscele di tipi di dati diversi, ad esempio l = [1, 2, 'a']. Non capisco di cosa stai parlando.
Celeritas,

362

Differenza tra elenco e tupla

  1. Letterale

    someTuple = (1,2)
    someList  = [1,2] 
  2. Dimensione

    a = tuple(range(1000))
    b = list(range(1000))
    
    a.__sizeof__() # 8024
    b.__sizeof__() # 9088

    A causa delle dimensioni più ridotte di un'operazione di tupla, diventa un po 'più veloce, ma non tanto da menzionare fino a quando non si ha un numero enorme di elementi.

  3. Operazioni consentite

    b    = [1,2]   
    b[0] = 3       # [3, 2]
    
    a    = (1,2)
    a[0] = 3       # Error

    Ciò significa anche che non è possibile eliminare un elemento o ordinare una tupla. Tuttavia, potresti aggiungere un nuovo elemento sia all'elenco che alla tupla con l'unica differenza che, poiché la tupla è immutabile, non stai davvero aggiungendo un elemento ma stai creando una nuova tupla, quindi l'id di cambierà

    a     = (1,2)
    b     = [1,2]  
    
    id(a)          # 140230916716520
    id(b)          # 748527696
    
    a   += (3,)    # (1, 2, 3)
    b   += [3]     # [1, 2, 3]
    
    id(a)          # 140230916878160
    id(b)          # 748527696
  4. uso

    Poiché un elenco è modificabile, non può essere utilizzato come chiave in un dizionario, mentre è possibile utilizzare una tupla.

    a    = (1,2)
    b    = [1,2] 
    
    c = {a: 1}     # OK
    c = {b: 1}     # Error

Quindi cosa succede quando provo a ridimensionare le dimensioni dell'elenco su valori grandi? Cambierà l'indirizzo di memoria (che credo dovrebbe cambiare l'id). O mi lancerà un errore?
WanderingMind

17
@WanderingMind: l'indirizzo di memoria in cui sono memorizzati i valori dell'elenco non è uguale all'indirizzo di memoria in cui è archiviato l'oggetto elenco stesso.
Tom,

2
Hmmm ... tutto il codice in questo post tranne la prima casella sotto 3. Permitted operationmostra prima il caso tupla. So che è normale mostrare successo, quindi errore, ma questo mi ha incasinato per qualche istante.
dmckee --- ex gattino moderatore,

1
Come mostrato al punto 3, può essere un singolo elenco di elementi one_item_list = [a], ma one_tuple = (a,)è la tupla corrispondente. Nota la virgola che segue il nome della variabile. Ma nota anche two_tuple = (a, b). Questo mi ha gettato via più di una volta (ancora lì in Python 3).
mjkrause,

1
@Cheng Perché l'ordinamento della tupla lo muterebbe, cioè cambierebbe i suoi elementi. Le tuple non lo supportano. Il modo più semplice per ottenere una tupla ordinata in pitone ètuple(sorted(the_unsorted_tuple))
ApproachingDarknessFish

204

Se sei andato a fare una passeggiata, puoi annotare le tue coordinate in qualsiasi momento in una (x,y)tupla.

Se desideri registrare il tuo viaggio, puoi aggiungere la tua posizione ogni pochi secondi a un elenco.

Ma non puoi farlo al contrario.


37
Questo esempio sembra semplicemente una convenzione. La gente potrebbe obiettare "Posso ancora usare [x, y] per annotare le coordinate se voglio". Pertanto, questa risposta è considerata incompleta a meno che non ci sia un'altra frase: "Leggi il post di @nikow per il motivo per cui non dovresti usare la lista per memorizzare le coordinate"
RayLuo

71
@Iceberg, la mia risposta ha lo scopo di aiutare a sviluppare l'intuizione. Non ha lo scopo di esplorare ogni sfumatura dell'argomento.
dan-gph,

8
Bell'esempio +1. Sottolinea la natura complementare degli elementi tupla (qui le coordinate), che è il motivo per cui non è consentito modificarne uno - perché cambia il significato dell'intera tupla (qui la posizione di un punto).
Hao Wang,

77

La differenza fondamentale è che le tuple sono immutabili. Ciò significa che non è possibile modificare i valori in una tupla dopo averla creata.

Quindi se hai bisogno di cambiare i valori usa un Elenco.

Vantaggi per le tuple:

  1. Leggero miglioramento delle prestazioni.
  2. Poiché una tupla è immutabile, può essere utilizzata come chiave in un dizionario.
  3. Se non puoi cambiarlo, non può farlo nessun altro, vale a dire che non devi preoccuparti di alcuna funzione API, ecc. Cambiare la tua tupla senza che ti venga chiesto.

14
Nota che una tupla è immutabile solo se tutti i suoi elementi lo sono . Si potrebbe dire che lo stesso vale per tutte le raccolte immutabili, come frozenseto i vari dict / tree / etc congelati di terze parti. tipi, ma nessuno di questi ti consente di aggiungere elementi mutabili. (E ovviamente una tupla è seccabile solo se tutti i suoi elementi lo sono, che è maniglie nel solito modo EAFP, quindi d[1, [2]]aumenterà TypeError: unhashable type: 'list'.)
abarnert,

1
Una tupla può essere utilizzata come chiave in un dizionario solo se tutti i suoi elementi sono immutabili. Vedi qui
Will Dereham,

31

Le liste sono mutabili; le tuple no.

Da docs.python.org/2/tutorial/datastructures.html

Le tuple sono immutabili e di solito contengono una sequenza eterogenea di elementi a cui si accede tramite decompressione (vedere più avanti in questa sezione) o indicizzazione (o anche per attributo nel caso di denominate coppie). Gli elenchi sono modificabili e i loro elementi sono generalmente omogenei e vi si accede ripetendo l'elenco.


1
Penso davvero che dovresti considerare anche le implicazioni semantiche (vedi la mia risposta di seguito).
nikow,

Sembra quasi che non valga la pena adesso, ma grazie per il testa a testa.
Duffymo,

Sei mesi dopo, e questo è tutto ciò che puoi contribuire? Ho dato quella risposta in quel momento perché nelle quattro ore trascorse tra la mia risposta originale e il commento altri avevano più che compensato la differenza. La risposta era errata? Non proprio, sebbene sia stato migliorato da Nikow. Quindi cosa aggiungerebbe davvero un link?
duffymo,

4
È divertente vedere come le altre risposte qui abbiano la stessa qualità come questa, ma solo questo viene odiato a causa di un commentatore che afferma "-1". E c'è un'altra risposta che ha solo 0,5 volte la qualità, ma solo 0,1 volte i voti negativi.
Sebastian Mach,

2
@duffymo Penso che questa risposta sia la più chiara e concisa in questa pagina. Nomina l'unica differenza davvero importante tra tuple ed elenchi e non si ciba all'infinito su questo palesemente omogeneo omogeneo vs eterogeneo frullato.
antred

20

È stato detto che la differenza è in gran parte semantica: le persone si aspettano che una tupla e un elenco rappresentino informazioni diverse. Ma questo va oltre una linea guida; alcune librerie si comportano in modo diverso in base a ciò che vengono passate. Prendi NumPy per esempio (copiato da un altro post in cui chiedo altri esempi):

>>> import numpy as np
>>> a = np.arange(9).reshape(3,3)
>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> idx = (1,1)
>>> a[idx]
4
>>> idx = [1,1]
>>> a[idx]
array([[3, 4, 5],
       [3, 4, 5]])

Il punto è, mentre NumPy potrebbe non far parte della libreria standard, è una libreria Python principale , e all'interno di elenchi e tuple NumPy ci sono cose completamente diverse.


2
Questa non è davvero una risposta utile. La differenza è che type(a_list) != type(a_tuple), quindi qualsiasi parte della ramificazione del codice della libreria basata type(x)si comporterà in modo diverso
Eric

1
buon punto, ho modificato il post: questo è davvero solo sottolineando che le linee guida semantiche sono codificate in alcune librerie.
Shep,

1
Potrebbe essere meglio usare esempi tratti da stdlib / builtin che da librerie di terze parti. Esistono diversi punti in cui è possibile utilizzare un singolo valore o una tupla di valori e un elenco o un'altra sequenza viene considerato un singolo valore. Ad esempio, '%d %d' % [2, 3]è un TypeError, perché stai cercando di passare un elenco al primo %de non stai passando alcun valore al secondo %d. (Tuttavia, ci sono anche contro-esempi, come max...)
abarnert,

è interessante, non sapevo che ci fossero esempi di questo nella libreria standard di Python. Un numero di posti che dici?
Shep

18

Le liste sono per il looping, le tuple sono per le strutture cioè "%s %s" %tuple.

Le liste sono generalmente omogenee, le tuple sono generalmente eterogenee.

Gli elenchi sono per lunghezza variabile, le tuple sono per lunghezza fissa.


16

Questo è un esempio di elenchi Python:

my_list = [0,1,2,3,4]
top_rock_list = ["Bohemian Rhapsody","Kashmir","Sweet Emotion", "Fortunate Son"]

Questo è un esempio di tupla di Python:

my_tuple = (a,b,c,d,e)
celebrity_tuple = ("John", "Wayne", 90210, "Actor", "Male", "Dead")

Le liste e le tuple di Python sono simili in quanto entrambe sono raccolte ordinate di valori. Oltre alla differenza superficiale che gli elenchi vengono creati usando le parentesi "[..., ...]" e le tuple usando le parentesi "(..., ...)", la differenza tecnica "hard coded in Python syntax" tra di loro è che gli elementi di una particolare tupla sono immutabili mentre gli elenchi sono mutabili (... quindi solo le tuple sono cancellabili e possono essere usate come chiavi dizionario / hash!). Ciò comporta differenze nel modo in cui possono o non possono essere utilizzate (imposte a priori dalla sintassi) e differenze nel modo in cui le persone scelgono di usarle (incoraggiate come "migliori pratiche", a posteriori, questo è ciò che le fanno i programmatori ). persone intelligenti danno al ordine degli elementi.

Per le tuple, "ordine" non significa altro che una specifica "struttura" per contenere le informazioni. Quali valori si trovano nel primo campo possono essere facilmente commutati nel secondo campo poiché ognuno fornisce valori attraverso due diverse dimensioni o scale. Forniscono risposte a diversi tipi di domande e sono in genere della forma: per un dato oggetto / soggetto, quali sono i suoi attributi? L'oggetto / soggetto rimane costante, gli attributi differiscono.

Per gli elenchi, "ordine" indica una sequenza o una direzionalità. Il secondo elemento DEVE seguire il primo elemento perché è posizionato al 2 ° posto in base a una scala o dimensione particolare e comune. Gli elementi sono presi nel loro insieme e forniscono principalmente risposte a una singola domanda tipicamente del modulo, per un dato attributo, come si confrontano questi oggetti / soggetti? L'attributo rimane costante, l'oggetto / soggetto differisce.

Ci sono innumerevoli esempi di persone nella cultura popolare e programmatori che non si conformano a queste differenze e ci sono innumerevoli persone che potrebbero usare un'insalata per il loro corso principale. Alla fine della giornata, va bene e di solito entrambi possono fare il lavoro.

Riassumendo alcuni dei dettagli più fini

Somiglianze:

  1. Duplicati : sia le tuple che gli elenchi consentono duplicati
  2. Indicizzazione, selezione e affettatura - Sia le tuple che gli elenchi vengono indicizzati utilizzando valori interi trovati tra parentesi. Quindi, se vuoi i primi 3 valori di un dato elenco o tupla, la sintassi sarebbe la stessa:

    >>> my_list[0:3]
    [0,1,2]
    >>> my_tuple[0:3]
    [a,b,c]
  3. Confronto e ordinamento : due tuple o due elenchi vengono entrambi confrontati dal loro primo elemento, e se c'è un pareggio, quindi dal secondo elemento e così via. Non viene prestata ulteriore attenzione agli elementi successivi dopo che elementi precedenti mostrano una differenza.

    >>> [0,2,0,0,0,0]>[0,0,0,0,0,500]
    True
    >>> (0,2,0,0,0,0)>(0,0,0,0,0,500)
    True

Differenze: - A priori, per definizione

  1. Sintassi : gli elenchi usano [], le tuple usano ()

  2. Mutabilità - Gli elementi in un determinato elenco sono mutabili, gli elementi in una data tupla NON sono mutabili.

    # Lists are mutable:
    >>> top_rock_list
    ['Bohemian Rhapsody', 'Kashmir', 'Sweet Emotion', 'Fortunate Son']
    >>> top_rock_list[1]
    'Kashmir'
    >>> top_rock_list[1] = "Stairway to Heaven"
    >>> top_rock_list
    ['Bohemian Rhapsody', 'Stairway to Heaven', 'Sweet Emotion', 'Fortunate Son']
    
    # Tuples are NOT mutable:       
    >>> celebrity_tuple
    ('John', 'Wayne', 90210, 'Actor', 'Male', 'Dead')
    >>> celebrity_tuple[5]
    'Dead'
    >>> celebrity_tuple[5]="Alive"
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: 'tuple' object does not support item assignment
  3. Hashtables (Dictionaries) - Dato che gli hashtables (dizionari) richiedono che le sue chiavi siano hash e quindi immutabili, solo le tuple possono agire come chiavi del dizionario, non elenchi.

    #Lists CAN'T act as keys for hashtables(dictionaries)
    >>> my_dict = {[a,b,c]:"some value"}
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'list'
    
    #Tuples CAN act as keys for hashtables(dictionaries)
    >>> my_dict = {("John","Wayne"): 90210}
    >>> my_dict
    {('John', 'Wayne'): 90210}

Differenze - A posteriori, in uso

  1. Omo vs eterogeneità degli elementi - Generalmente gli oggetti elenco sono omogenei e gli oggetti tupla sono eterogenei. Cioè, le liste sono usate per oggetti / soggetti dello stesso tipo (come tutti i candidati presidenziali, o tutte le canzoni, o tutti i corridori) mentre sebbene non sia forzato da), mentre le tuple sono più per oggetti eterogenei.

  2. Looping vs. Structures - Sebbene entrambi consentano il looping (per x in my_list ...), ha davvero senso farlo solo per un elenco. Le tuple sono più appropriate per strutturare e presentare informazioni (% s% s residente in% s è un% se attualmente% s% ("John", "Wayne", 90210, "Attore", "Morto")


Mi piace l'esempio hashtable / hashable per spiegare una ragione per l'immutabilità: puoi usare una tupla (record / struct / coordinate / vector / point) come chiave complessa in un dict.
Dave X,

9

I valori dell'elenco possono essere modificati in qualsiasi momento, ma i valori delle tuple non possono essere modificati.

I vantaggi e gli svantaggi dipendono dall'uso. Se si dispone di tali dati che non si desidera modificare, è necessario utilizzare la tupla, altrimenti l'elenco è l'opzione migliore.


7

Differenza tra elenco e tupla

Tuple ed elenchi sono entrambi tipi di sequenza apparentemente simili in Python.

  1. Sintassi letterale

    Usiamo le parentesi ( ) per costruire tuple e parentesi quadre [ ]per ottenere un nuovo elenco. Inoltre, possiamo usare la chiamata del tipo appropriato per ottenere la struttura richiesta - tupla o elenco.

    someTuple = (4,6)
    someList  = [2,6] 
  2. Mutabilità

    Le tuple sono immutabili, mentre le liste sono mutabili. Questo punto è la base per i seguenti.

  3. Utilizzo della memoria

    A causa della mutabilità, è necessaria più memoria per gli elenchi e meno memoria per le tuple.

  4. Estensione

    Puoi aggiungere un nuovo elemento sia alle tuple che agli elenchi con l'unica differenza che l'id della tupla verrà modificato (ovvero, avremo un nuovo oggetto).

  5. hashing

    Le tuple sono cancellabili e le liste no. Significa che puoi usare una tupla come chiave in un dizionario. L'elenco non può essere utilizzato come chiave in un dizionario, mentre è possibile utilizzare una tupla

    tup      = (1,2)
    list_    = [1,2] 
    
    c = {tup   : 1}     # ok
    c = {list_ : 1}     # error
  6. Semantica

    Questo punto riguarda maggiormente le migliori pratiche. Dovresti usare le tuple come strutture di dati eterogenee, mentre gli elenchi sono sequenze omogenee.


1
Il mio voto qui per la discussione esplicita di estensione e hashing, che non ho notato nelle risposte esistenti altrimenti molto buone.
dmckee --- ex gattino moderatore,

6

Le liste sono intese come sequenze omogenee, mentre le tuple sono strutture di dati eterogenee.


26
A questo punto, questa risposta non aggiunge nulla alla discussione, poiché ci sono molte altre risposte migliori.
Jonathon Reinhart,

5

Dato che le persone hanno già risposto qui che tuplessono immutabili mentre listssono mutabili, ma c'è un aspetto importante dell'uso delle tuple che dobbiamo ricordare

Se tuplecontiene un listo un dictionaryal suo interno, questi possono essere cambiati anche se lo tuplestesso è immutabile.

Ad esempio, supponiamo di avere una tupla che contiene un elenco e un dizionario come

my_tuple = (10,20,30,[40,50],{ 'a' : 10})

possiamo cambiare il contenuto dell'elenco come

my_tuple[3][0] = 400
my_tuple[3][1] = 500

che fa apparire la nuova tupla

(10, 20, 30, [400, 500], {'a': 10})

possiamo anche cambiare il dizionario all'interno della tupla come

my_tuple[4]['a'] = 500

che farà apparire la tupla complessiva

(10, 20, 30, [400, 500], {'a': 500})

Ciò accade perché liste dictionarysono gli oggetti e questi oggetti non cambiano, ma i contenuti a cui punta.

Quindi tuplerimane immutabile senza alcuna eccezione


Questo post sarebbe migliorato se spiegassi che "quelli possono essere cambiati anche se la tupla stessa è immutabile". è perché quegli oggetti mantengono la loro identità mentre (quindi la tupla non è cambiata perché contiene ancora gli stessi oggetti ...).
dmckee --- ex gattino moderatore,

3

Il PEP 484 - Type Hints afferma che i tipi di elementi di a tuplepossono essere digitati individualmente; in modo che tu possa dire Tuple[str, int, float]; ma a list, con la Listclasse di digitazione può prendere solo un parametro di tipo:, il List[str]che suggerisce che la differenza del 2 è che il primo è eterogeneo, mentre il secondo intrinsecamente omogeneo.

Inoltre, la libreria standard utilizza principalmente la tupla come valore di ritorno da tali funzioni standard in cui la C restituisce a struct.


3

Dato che la gente ha già menzionato le differenze, scriverò sul perché le tuple.

Perché le tuple sono preferite?

Ottimizzazione dell'allocazione per piccole tuple

Per ridurre la frammentazione della memoria e accelerare le allocazioni, Python riutilizza vecchie tuple. Se una tupla non è più necessaria e contiene meno di 20 elementi invece di eliminarla definitivamente, Python la sposta in un elenco libero.

Un elenco gratuito è diviso in 20 gruppi, in cui ciascun gruppo rappresenta un elenco di tuple di lunghezza n tra 0 e 20. Ogni gruppo può memorizzare fino a 2 000 tuple. Il primo (zero) gruppo contiene solo 1 elemento e rappresenta una tupla vuota.

>>> a = (1,2,3)
>>> id(a)
4427578104
>>> del a
>>> b = (1,2,4)
>>> id(b)
4427578104

Nell'esempio sopra possiamo vedere che aeb hanno lo stesso id. Questo perché abbiamo immediatamente occupato una tupla distrutta che era nella lista libera.

Ottimizzazione dell'allocazione per elenchi

Poiché gli elenchi possono essere modificati, Python non utilizza la stessa ottimizzazione delle tuple. Tuttavia, anche gli elenchi Python hanno un elenco gratuito, ma viene utilizzato solo per oggetti vuoti. Se un elenco vuoto viene eliminato o raccolto da GC, può essere riutilizzato in seguito.

>>> a = []
>>> id(a)
4465566792
>>> del a
>>> b = []
>>> id(b)
4465566792

Fonte: https://rushter.com/blog/python-lists-and-tuples/

Perché le tuple sono efficienti delle liste? -> https://stackoverflow.com/a/22140115


2

Una citazione di direzione dalla documentazione del 5.3. Tuple e sequenze :

Sebbene le tuple possano sembrare simili agli elenchi, sono spesso utilizzate in diverse situazioni e per scopi diversi. Le tuple sono immutabili e di solito contengono una sequenza eterogenea di elementi a cui si accede tramite decompressione (vedere più avanti in questa sezione) o indicizzazione (o anche per attributo nel caso di tuple nominate). Liste sono mutabili , ei loro elementi sono generalmente omogenei e sono accessibili scorrendo sull'elenco.


1

Prima di tutto, entrambi sono gli oggetti non scalari (noti anche come oggetti composti) in Python.

  • Tuple, sequenza ordinata di elementi (che può contenere qualsiasi oggetto senza problemi di aliasing)
    • Immutabile (tupla, int, float, str)
    • Concatenazione utilizzando + (la nuova tupla verrà creata ovviamente)
    • indicizzazione
    • Affettare
    • Singleton (3,) # -> (3)invece di(3) # -> 3
  • Elenco (array in altre lingue), sequenza di valori ordinata
    • Mutevole
    • Singleton [3]
    • clonazione new_array = origin_array[:]
    • La comprensione dell'elenco [x**2 for x in range(1,7)]ti dà [1,4,9,16,25,36](Non leggibile)

L'uso dell'elenco può anche causare un errore di aliasing (due percorsi distinti che puntano allo stesso oggetto).


0

Le liste sono mutabili e le tuple sono immutabili. Considera solo questo esempio.

a = ["1", "2", "ra", "sa"]    #list
b = ("1", "2", "ra", "sa")    #tuple

Ora cambia i valori dell'indice di elenco e tupla.

a[2] = 1000
print a     #output : ['1', '2', 1000, 'sa']
b[2] = 1000
print b     #output : TypeError: 'tuple' object does not support item assignment.

Pertanto, il seguente codice non è valido con la tupla, poiché abbiamo tentato di aggiornare una tupla, che non è consentito.


-1

L'elenco è modificabile e le tuple sono immutabili. La principale differenza tra mutabile e immutabile è l'utilizzo della memoria quando si tenta di aggiungere un elemento.

Quando si crea una variabile, viene assegnata parte della memoria fissa alla variabile. Se è un elenco, viene assegnata più memoria di quella effettivamente utilizzata. Ad esempio, se l'attuale assegnazione di memoria è di 100 byte, quando si desidera aggiungere il 101 ° byte, forse verranno assegnati altri 100 byte (in totale 200 byte in questo caso).

Tuttavia, se sai che non aggiungi spesso nuovi elementi, allora dovresti usare le tuple. Tuple assegna esattamente la dimensione della memoria necessaria e quindi risparmia memoria, specialmente quando si utilizzano grandi blocchi di memoria.


2
Mentre un po 'di questo è tecnicamente vero, non è proprio la differenza cruciale tra tipi mutabili e immutabili. La differenza più grande è che i tipi mutabili possono essere cambiati dopo la costruzione, mentre i tipi immutabili non possono.
Roger Fan,

1
Non è questo il motivo. Memoria e mutabilità non hanno nulla a che fare l'una con l'altra. Questo è semplicemente un dettaglio di implementazione specifico per gli elenchi. Anche la memoria non è assegnata alle variabili, è assegnata agli oggetti. Le variabili sono quindi solo riferimenti a quegli oggetti.
Roger Fan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.