2011-11-20 14 views
8

Ho un leggero problema a capire il comportamento delle liste.Assegnazione lista ad un valore in quella lista

La mia domanda esercizio è: Disegnare un modello di memoria che mostra l'effetto delle seguenti affermazioni:

values = [0, 1, 2] 
values[1] = values 

Il mio pensiero è che l'esecuzione di queste dichiarazioni cambierà l'elenco per qualcosa di simile [0, [0, 1, 2], 3] , in altre parole seconda istruzione aggiungerà il secondo valore nella lista (1) ma quando eseguo queste istruzioni e stampo la lista in Python shell (3.2) ottengo il seguente risultato:

[0, [...], 2] 

Qualcosa è successo alla seconda entrata, ma non sono sicuro di cosa, qualcuno può spiegare cosa è successo?

Grazie, Damian

risposta

13

Hai creato una struttura dati ricorsiva. Il secondo elemento nell'elenco è un riferimento all'elenco stesso. Quando stampi questo, normalmente ti aspetteresti di vedere l'elenco originale in secondo luogo, come suggerisci nella tua domanda.

Tuttavia, non si sta inserendo una copia della lista originale, si inserisce un di riferimento alla lista attuale. Quindi, il secondo elemento deve stampare l'intera lista. Ma il secondo elemento di questo secondo elemento è di per sé un riferimento all'elenco, quindi quando stampa il suo elemento secondo, .... Python gestisce con grazia questo visualizzando [...] poiché l'unica altra soluzione è presentare un insieme infinito di liste annidate

Immaginate in questo modo: dopo l'assegnazione a values[1], l'elenco può essere pensato a questo aspetto:

[0, <pointer to itself>, 2] 

Naturalmente, <pointer to itself>, quando stampato, si presenta come:

[0, <pointer to itself>, 2] 

Quando si mettono insieme quelli, si ottiene:

[0, [0, <pointer to itself>, 2], 2] 

Ma, naturalmente, per la stampa che più interno <pointer to itself>, anche, deve essere stampata:

[0, [0, [0, <pointer to itself>, 2], 2], 2] 

... e così via. Sono le tartarughe fino in fondo.

+0

+1 per le tartarughe :) –

+0

@Bryan Oakley, grazie per la tua risposta è un'ottima spiegazione. Tutto si riduce al riferimento/copia di cui ho bisogno per essere più vigile. –

3

Si sono letteralmente inserendo un elenco in se stessa. La lista risultante non può essere stampato più perché va un po 'in un cerchio:

values = [0, 1, 2] 
values[1] = values 
# so the list now looks like 
[0, values, 2] 
# so we expand the variable and get 
[0, [0, values, 2], 2] 
# and so on 
[0, [0, [0, values, 2], 2], 2] 
# as this will never end instead Python prints 
[0, [...], 2] 

Così [...] significa che l'elenco stesso contiene.

0

quello che funziona per voi è:

values = [0, 1, 2] 
values[1] = values[:] # or list(values) 

Per ulteriori informazioni su copiare liste e riferimenti vedere here.

+2

Sono in down-voting perché questo non risponde alla domanda. La domanda non è come memorizzare una copia di una lista nella lista. La domanda è: "spiega cosa succede quando si imposta un elemento in una lista come riferimento a se stesso". Questa risposta non offre alcuna spiegazione, solo una soluzione alternativa. Mentre quello che dici è un consiglio molto utile, non è utile nel contesto di questa domanda. –

+1

@Bryan Oakley: sebbene non risponda alla domanda originale, questa è l'unica voce che in realtà ti dice come farlo, e per tale approccio pragmatico merita sicuramente un upvote. –

Problemi correlati