2010-02-23 11 views
22

Si volviera a ejecutar este código:Python lista que pasa como argumento

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

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

¿Por qué sería volver [ 'sí'] a pesar de que no estoy cambiando directamente el 'ejemplo' variable y ¿Cómo podría modificar el código para que 'ejemplo' no se vea afectado por la función?

+0

http://effbot.org/zone/default-values.htm describe un problema diferente pero algo relacionado. Lectura que puede ayudarlo a entender lo que está pasando. – MatrixFrog

Respuesta

41

Todo es una referencia en Python. Si desea evitar ese comportamiento, deberá crear una copia nueva del original con list(). Si la lista contiene más referencias, que había necesidad de utilizar 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) 

salidas

['HI'] 
[] 
+3

También puede crear una copia de cualquier lista con 'myList [:]', pero tenga en cuenta que esta es una "copia superficial", lo que significa que el elemento n de la nueva lista se refiere al mismo objeto como el enésimo elemento de la antigua uno. – MatrixFrog

+0

Buen punto, MatrixFrog –

6

"¿Por qué sería volver ['yes']"

Debido a que modificó la lista, example.

"aunque no estoy cambiando directamente la variable 'ejemplo'."

Pero está, proporcionó el objeto denominado por la variable example a la función. La función modificó el objeto utilizando el método append del objeto.

Como se discutió en otra parte en SO, append no crea nada nuevo. Modifica un objeto en su lugar.

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

y cómo podría modificar el código para que la función no 'afecte' el ejemplo?

¿Qué quieres decir con eso? Si no desea que la función actualice example, no la pase a la función.

Si desea que la función cree una nueva lista, escriba la función para crear una nueva lista.

8

La forma más fácil de modificar el código será agregar el [:] a la llamada a la función.

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



example = list() 
function(example[:]) 
print(example) 
0

Es porque llamó a la función antes de imprimir la lista. Si imprime la lista, luego llama a la función y luego imprime la lista nuevamente, obtendrá una lista vacía seguida de la versión adjunta. Está en el orden de tu código.

Cuestiones relacionadas