valor una referencia recibir por paso pasar parametros parametro omision objeto lista como python reference pass-by-reference pass-by-value

recibir - Python: ¿Cuándo se pasa una variable por referencia y cuándo por valor?



paso por valor y referencia (6)

Posible duplicado:
Python: ¿Cómo paso una variable por referencia?

Mi código :

locs = [ [1], [2] ] for loc in locs: loc = [] print locs # prints => [ [1], [2] ]

¿Por qué es loc no referencia de elementos de locs ?

Python: todo se pasa como referencia a menos que se copie explícitamente [¿No es esto cierto? ]

Por favor, explique ... ¿cómo decide Python referenciar y copiar ?

Actualización:

Cómo hacer ?

def compute(ob): if isinstance(ob,list): return process_list(ob) if isinstance(ob,dict): return process_dict(ob) for loc in locs: loc = compute(loc) # What to change here to make loc a reference of actual locs iteration ?

  • Locs debe contener la respuesta final procesada!
  • No quiero usar enumerate , ¿es posible sin ella?

¿Por qué es loc no referencia de elementos de locs?

Es O al menos, es en el mismo sentido que todas las demás variables de Python son. Las variables de Python son nombres, no almacenamiento . loc es un nombre que se usa para referirse a elementos de [[1,2], [3,4]] , mientras que locs es un nombre que se refiere a toda la estructura.

loc = []

Esto no significa "mirar lo que loc nombres y hacer que se convierta en [] ". No puede significar eso, porque los objetos de Python no son capaces de tal cosa.

En su lugar, significa "causa que loc deje de ser un nombre para lo que actualmente es un nombre, y en lugar de eso comienza a ser un nombre para [] ". (Por supuesto, significa el [] específico que se proporciona allí, ya que en general puede haber varios objetos en la memoria que sean iguales).

Naturalmente, el contenido de las locs se modifica como resultado.


Cuando tu dices

loc = []

está volviendo a vincular la variable loc a una lista vacía recién creada

Tal vez tu quieras

loc[:] = []

Que asigna una porción (que resulta ser la lista completa) de loc a la lista vacía


Effbot (también conocido como Fredrik Lundh) ha descrito el estilo de paso variable de Python como llamada por objeto: http://effbot.org/zone/call-by-object.htm

Los objetos se asignan en el montón y los punteros a ellos se pueden pasar a cualquier lugar.

  • Cuando realiza una asignación como x = 1000 , se crea una entrada de diccionario que asigna la cadena "x" en el espacio de nombres actual a un puntero al objeto entero que contiene mil.
  • Cuando actualiza "x" con x = 2000 , se crea un nuevo objeto entero y el diccionario se actualiza para que apunte al nuevo objeto. El antiguo mil objeto permanece sin cambios (y puede o no estar vivo dependiendo de si alguna otra cosa se refiere al objeto).
  • Cuando realiza una nueva asignación como y = x , se crea una nueva entrada de diccionario "y" que apunta al mismo objeto que la entrada de "x".
  • Objetos como cadenas y enteros son inmutables . Esto simplemente significa que no hay métodos que puedan cambiar el objeto después de que se haya creado. Por ejemplo, una vez que se crea el objeto entero mil, nunca cambiará. Matemáticas se realiza mediante la creación de nuevos objetos enteros.
  • Objetos como listas son mutables . Esto significa que el contenido del objeto puede ser cambiado por cualquier cosa que apunte al objeto. Por ejemplo, x = []; y = x; x.append(10); print y x = []; y = x; x.append(10); print y x = []; y = x; x.append(10); print y se imprimirá [10] . Se creó la lista vacía. Tanto "x" como "y" apuntan a la misma lista. El método de anexión muta (actualiza) el objeto de la lista (como agregar un registro a una base de datos) y el resultado es visible tanto para "x" como para "y" (al igual que una actualización de la base de datos sería visible para cada conexión a esa base de datos).

Espero que te aclare el tema.


En Python no ayuda pensar en términos de referencias o valores. Tampoco es correcto.

En Python, las variables son solo nombres. En su bucle for, loc es solo un nombre que apunta al elemento actual en la lista. Doing loc = [] simplemente vuelve a vincular el nombre loc a una lista diferente, dejando solo la versión original.

Pero como en su ejemplo, cada elemento es una lista, en realidad podría mutar ese elemento, y eso se reflejaría en la lista original:

for loc in locs: loc[0] = loc[0] * 2


Todo en Python se pasa y se asigna por valor, de la misma manera que todo se pasa y se asigna por valor en Java. Cada valor en Python es una referencia (puntero) a un objeto. Los objetos no pueden ser valores. La asignación siempre copia el valor (que es un puntero); dos punteros de este tipo pueden apuntar al mismo objeto. Los objetos nunca se copian a menos que esté haciendo algo explícito para copiarlos.

Para su caso, cada iteración del bucle asigna un elemento de la lista a la variable loc . A continuación, asigna otra cosa a la variable loc . Todos estos valores son punteros; estás asignando punteros; Pero no afecta a ningún objeto de ninguna manera.


Todo se pasa por objeto. Rebobinar y mutar son diferentes operaciones.

locs = [ [1], [2] ] for loc in locs: del loc[:] print locs