Entonces, ¿en una función no se muestra la adición de 6 al conjunto pero no cuando no está en una función?
No, eso no es lo que sucede.
Lo que pasa es que, cuando ejecuta mylist = mylist + [6]
, está creando efectivamente una lista completamente nueva y colocándola en la variable local mylist
. Esta variable mylist
desaparecerá después de la ejecución de la función y la lista recién creada desaparecerá también.
OTOH cuando ejecuta mylist.append(6)
no crea una nueva lista. Obtiene la lista ya en la variable mylist
y agrega un nuevo elemento a esta misma lista. El resultado es que la lista (apuntada por list2
también) se modificará. La variable mylist
desaparecerá de nuevo, pero en este caso modificó la lista original.
Veamos si una explicación más visual puede ayudar :)
lo que sucede cuando se llama a proc()
Cuando se escribe list1 = [1, 2, 3, 4, 5]
va a crear un nuevo objeto de lista (en el lado derecho de los iguales signo) y crear una nueva variable, list1
, que apuntará a este objeto.
Entonces, cuando se llama proc()
, se crea otra nueva variable, mylist
, y puesto que se pasa list1
como parámetro, mylist
va a apuntar al mismo objeto:
Sin embargo , la operación mylist + [6]
crea un objeto de lista completamente nuevo cuyo contenido es el contenido del objeto apuntado por mylist
más el contenido del siguiente objeto de la lista, es decir, [6]
. Dado que atribuye este nuevo objeto a mylist
, nuestro escenario cambia un poco y mylist
no apunta al mismo objeto apuntado por list1
más:
Lo que no he dicho es que mylist
es una variable local : desaparecerá después del final de la función proc()
. Por lo tanto, cuando la ejecución proc()
terminó, el mylist
se ha ido:
Dado que no hay otros puntos variables en el objeto generado por mylist + [6]
, desaparecerá, también (ya que el recolector de basura * va a recogerla):
Tenga en cuenta que, al final, el objeto apuntado por list1
no se cambia.
¿Qué ocurre cuando se llama proc2()
Todo cambia cuando se llama proc2()
. En un primer momento, que es lo mismo: se crea una lista ...
... y pasarlo como parámetro a una función, lo que generará una variable local:
Sin embargo, en lugar de utilizar el operador de concatenación +
, que genera una nueva lista, aplica el método append()
a la lista existente. El método append()
no crea un nuevo objeto; En su lugar, _changes la existente:
Después del final de la función, la variable local desaparecerá, pero el objeto original señalado por él y por list1
será ya alterada:
Dado que todavía apunta por list1
, la lista original no se destruye.
EDITAR: si quieres echar un vistazo a todas estas cosas sucediendo ante sus ojos sólo tiene que ir a this radically amazing simulator:
* Si usted no sabe lo que es recolector de basura. .. bueno, lo descubrirás poco después de entender tu propia pregunta.
También hay un buen [servicio] (http://people.csail.mit.edu/pgbovine/python/tutor.html#mode=edit) para ir paso a paso al código python y observar todas las variables en el navegador. Muy cerca de lo que escribiste, @brandizzi – stalk
+1 para dibujo tan bueno ... – gsagrawal
@stalk No conocía este servicio. es simplemente genial! ¡Gracias! – brandizzi