2012-03-08 13 views
10

Sono molto nuovo a Python, mi dispiace per la semplice domanda. (Anche se, ho passato ora 2 ore per trovare una risposta)Python: Confuso con list.remove

ho semplificato il mio codice per illustrare il problema:

side=[5] 
eva=side 
print(str(side) + " side before") 
print(str(eva) + " eva before") 
eva.remove(5) 
print(str(side) + " side after") 
print(str(eva) + " eva after") 

Questo produce:

[5] side before 
[5] eva before 
[] side after 
[] eva after 

Perché il comando remove anche influisce sulla lista 'lato'? Cosa posso fare per utilizzare una copia di "side", senza modificare l'elenco?

La ringrazio molto

Edit: La ringrazio molto per le risposte buone e comprensibili!

+2

Ti sei imbattuto nell'idea dei nomi in python. http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#python-has-names – GoingTharn

+1

@GoingTharn * Gli spazi dei nomi * sono una questione completamente diversa. Si imbatte nel fatto che non ci sono tipi di valore in Python (e sì, che può essere descritto in un gazillion anche in altri modi - ma "namespace" non è tra questi). – delnan

+0

@delnan d'accordo; Ho realizzato con orrore che avevo scritto spazi dei nomi e modificato per i nomi. Il collegamento di Dusan nella (attuale) votazione più votata è comunque meglio del mio. – GoingTharn

risposta

13

Python ha "cose" e "nomi di cose". Quando si scrive

side = [5] 

si effettua una cosa nuova [5], e dargli il nome side. Quando si scrive

eva = side 

si crea un nuovo nome per side. Le assegnazioni stanno solo dando nomi alle cose! C'è ancora solo una cosa [5], con due nomi diversi.

Se si vuole una cosa nuova, è necessario chiedere in modo esplicito. Di solito dovresti fare copy.copy(thing), anche se nel caso delle liste c'è sintassi speciale thing[:].

FYI "cose" sono di solito chiamati "oggetti"; "nomi" sono solitamente chiamati "riferimenti".

+0

La risposta corretta è che gli elenchi sono mutabili! Altri oggetti Python (come le stringhe) non si comportano in questo modo ... –

11

eva e side riferiscono alla stessa lista.

Se si desidera avere una copia della lista:

eva = side[:] 

Puoi leggere altro sulla copia di elenchi in questo articolo: Python: copying a list the right way

Edit: Questo non è l'unico modo per copiare le liste. Vedi il link pubblicato nel primo commento di questa risposta.

+4

C'è anche la risposta eccellente su http://stackoverflow.com/questions/2612802/how-to-clone-a-list-in-python/2612815#2612815. –

+0

Oppure, dall'articolo eva = lista (lato) – jgritty

1

dusan's risposta è corretta, ed è un approccio intelligente, ma penso che rompe lo Zen di Python linea guida che "Esplicito è meglio che implicita."

Un modello molto più comune che ho visto per garantire un elemento è un deepcopy è con il modulo copy.

>>> import copy 
>>> eva = copy.copy(side) 
+4

Non credo che infranga la linea guida esplicativa. È _esplicitamente_ copiando! Sintassi opaca, forse. – katrielalex

+4

Nota anche 'copy.copy' fa lo stesso di' [:] ', non' copy.deepcopy'. – katrielalex

+0

I due sono diversi casi d'uso. Non è sempre necessario creare copie degli articoli nell'elenco. – Darthfett