2012-03-08 12 views
10

Soy muy nuevo en Python, así que lamento la pregunta probablemente simple. (Aunque, pasé ahora 2 horas para encontrar una respuesta)Python: confundido con list.remove

he simplificado mi código para ilustrar el 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") 

Esto produce:

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

¿Por qué la orden de supresión también afecta la lista 'lado'? ¿Qué puedo hacer para usar una copia de 'lado', sin modificar la lista?

Muchas gracias

Editar: Muchas gracias por las respuestas buenas y comprensibles!

+2

Te has topado con la idea de nombres en python. http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#python- has-names – GoingTharn

+1

@GoingTharn * Los espacios de nombres * son una cuestión bastante diferente. Se ha topado con el hecho de que no hay tipos de valores en Python (y sí, eso también puede describirse de muchas otras maneras, pero los "espacios de nombres" no están entre ellos). – delnan

+0

@delnan estuvo de acuerdo; Me di cuenta con horror que había escrito espacios de nombres y editado para nombres. El enlace de Dusan en la respuesta (actual) mejor votado es mejor que el mío de todos modos. – GoingTharn

Respuesta

13

Python tiene "cosas" y "nombres de cosas". Cuando se escribe

side = [5] 

haces una cosa nueva [5], y darle el nombre side. Cuando a continuación, escribir

eva = side 

a tomar un nuevo nombre para side. ¡Las asignaciones solo dan nombres a las cosas! Todavía hay una sola cosa, [5], con dos nombres diferentes.

Si desea algo nuevo, debe solicitarlo explícitamente. Normalmente harías copy.copy(thing), aunque en el caso de las listas hay una sintaxis especial thing[:].

FYI "cosas" se suelen llamar "objetos"; los "nombres" se suelen llamar "referencias".

+0

¡La respuesta correcta es que las listas son mutables! Otros objetos de Python (como Strings) no se comportan de esta manera ... –

11

eva y side se refieren a la misma lista.

Si usted desea tener una copia de la lista:

eva = side[:] 

Usted puede leer más acerca de la copia de las listas en este artículo: Python: copying a list the right way

Editar: Esa no es la única manera de copiar listas. Vea el enlace publicado en el primer comentario de esta respuesta.

+4

También existe la excelente respuesta en http://stackoverflow.com/questions/2612802/how-to-clone-a-list-in-python/2612815#2612815. –

+0

O, del artículo eva = list (side) – jgritty

1

dusan's la respuesta es correcta, y es un enfoque inteligente, pero creo que rompe la directriz de Zen de Python que "Explícito es mejor que implícito".

Un patrón mucho más común que he visto para asegurar que un artículo es una copia profunda es con el módulo copy.

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

No creo que rompa la pauta de explicitud. Está _explícitamente_ copiando! Sintaxis opaca, tal vez. – katrielalex

+4

También tenga en cuenta que 'copy.copy' hace lo mismo que' [:] ', no' copy.deepcopy'. – katrielalex

+0

Los dos son casos de uso diferentes. No necesariamente siempre quiere hacer copias de los elementos en la lista. – Darthfett

Cuestiones relacionadas