2010-02-23 4 views
22

Se dovessi eseguire questo codice:Python lista passando come argomento

def function(y): 
    y.append('yes') 
    return y 

example = list() 
function(example) 
print(example) 

Perché dovrebbe tornare [ 'sì'], anche se io non sto cambiando direttamente l' 'esempio' variabile, e come potrei modificare il codice in modo che 'esempio' non sia influenzato dalla funzione?

+0

http://effbot.org/zone/default-values.htm descrive un problema diverso ma in qualche modo correlato. Leggere ciò potrebbe aiutarti a capire cosa sta succedendo. – MatrixFrog

risposta

41

Tutto è un riferimento in Python. Se desideri evitare questo comportamento, dovresti creare una nuova copia dell'originale con list(). Se l'elenco contiene più riferimenti, avresti bisogno di usare deepcopy()

def modify(l): 
l.append('HI') 
return l 

def preserve(l): 
t = list(l) 
t.append('HI') 
return t 

example = list() 
modify(example) 
print(example) 

example = list() 
preserve(example) 
print(example) 

uscite

['HI'] 
[] 
+3

Puoi anche creare una copia di qualsiasi lista con 'myList [:]', ma tieni presente che si tratta di una "copia superficiale" che significa che l'ennesimo elemento della nuova lista fa riferimento allo stesso oggetto dell'ennesimo elemento del vecchio uno. – MatrixFrog

+0

Buon punto, MatrixFrog –

6

"Perché dovrebbe tornare ['yes']"

Perché si è modificato l'elenco, example.

"anche se non sto cambiando direttamente la variabile 'esempio'."

Tuttavia, si è fornito l'oggetto denominato dalla variabile example alla funzione. La funzione ha modificato l'oggetto utilizzando il metodo append dell'oggetto.

Come discusso altrove su SO, append non crea nulla di nuovo. Modifica un oggetto sul posto.

Vedere Why does list.append evaluate to false?, Python append() vs. + operator on lists, why do these give different results?, Python lists append return value.

e in che modo è possibile modificare il codice in modo che l''esempio' non sia interessato dalla funzione?

Cosa intendi con questo? Se non si desidera aggiornare example con la funzione, non passarla alla funzione.

Se si desidera che la funzione crei un nuovo elenco, scrivere la funzione per creare un nuovo elenco.

8

Il modo più semplice per modificare il codice sarà aggiungere [:] alla chiamata di funzione.

0

È perché hai chiamato la funzione prima di stampare l'elenco. Se si stampa l'elenco, chiamare la funzione e stampare di nuovo l'elenco, si otterrà una lista vuota seguita dalla versione allegata. È nell'ordine del tuo codice.

Problemi correlati