pyplot python pass-by-reference pass-by-value

pyplot - Pasando valores en Python



title plt python (8)

Esta pregunta ya tiene una respuesta aquí:

Cuando pasa una colección como lista, matriz a otra función en python, ¿hace una copia o es solo un puntero?


El objeto se pasa. No es una copia, sino una referencia al objeto subyacente.


La cosa es que todo el concepto de referencia / valor no encajará en Python. Python no tiene "valor" de una variable. Python solo tiene objetos y nombres que hacen referencia a objetos.

Entonces cuando llamas a una función y pones un "nombre" dentro del paréntesis, así:

def func(x): # defines a function that takes an argument ... # do something here func(myname) # calling the function

El objeto real al que myname apunta se pasa, no el nombre myname sí mismo . Dentro de la función se da otro nombre ( x ) para referirse al mismo objeto pasado.

Puede modificar el objeto dentro de la función si es mutable, pero no puede cambiar a qué apunta el nombre externo . Lo mismo que sucede cuando lo haces

anothername = myname

Por lo tanto, puedo responder su pregunta con:

es "pasar por valor", pero todos los valores son solo referencias a objetos.


Las respuestas aquí han sido útiles, pero encuentro la necesidad de exhibir esta distinción que no he visto, que he probado con el experimento CL posterior:

  1. Un objeto inmutable ALONE NO PUEDE ser cambiado dentro de una llamada de función. (Las respuestas hasta ahora han dicho eso mucho ...)
  2. PERO, un objeto inmutable CONTENIDO DENTRO de un objeto mutable PUEDE ser reasignado dentro de una llamada a método.

''num'' no cambia aquí porque es un objeto numérico inmutable [admite mi punto 1.]:

def incr_num(num): num += 1 num = 0 num 0 incr_num(num) num 0

''list [0]'' aquí también es un objeto Number inmutable.

def incr_list(list): list[0] += 1 list = [0] list[0] 0 incr_list(list) list[0] 1

Entonces, ¿cómo ''lista [0]'', siendo un objeto numérico inmutable, cambia (admite mi punto 2) mientras que el objeto numérico ''num'' del ejemplo anterior no? El objeto numérico inmutable ''lista [0]'' está dentro del objeto lista mutable ''lista'', mientras que ''num'' del primer ejemplo es simplemente un objeto numérico no contiado.

Aunque bien intencionado, creo que la mejor calificada de (citada a continuación), y algunas otras similares, no eran totalmente correctas (y eso me motivó a escribir esta respuesta):

Algunos objetos, como cuerdas, tuplas y números, son inmutables. Alterarlos dentro de una función / método creará una nueva instancia y la instancia original fuera de la función / método no cambiará.

Mi segundo experimento de código anterior muestra un objeto Número (''lista [0]'') que se altera dentro de un método, y luego la instancia original fuera de la función cambió.


Por favor déjame dar un humilde ejemplo

def swap(a, b): x = a print id(x) print id(a) print id(b) a = b print id(a) b = x print id(b) a[0]= ''20'' var1 = [''1'',''2'',''3'',''4''] var2 = [''5'',''6'',''7'',''8'',''9''] print id(var1) print id(var2) swap(var1, var2) print id(var1) print id(var2) print var1 print var2

que produce el siguiente resultado

28329344 var1 28331264 var2 28329344 x 28329344 a 28331264 b Después de a = b 28331264 a después de b = x 28329344 b después del retorno 28329344 var1 28331264 var2 [''1'', ''2'', ''3'', ''4''] [''20'', ''6'', ''7'', ''8'', ''9'']

Asignación a las direcciones de memoria 28329344 28331264 var1 var2 ab x Después de a = ba Después de b = xb Después de a [0] = ''20'' [0] = ''20'' Después de regresar [''1'', ''2'', ''3'', ''4''] [''20'', ''6'', ''7'', ''8'', ''9'']


Por referencia:

>>> x = [0,1,2,3] >>> def foo(x_list): x_list[0] = 1 >>> foo(x) >>> x [1, 1, 2, 3]


Python pasa referencias a objetos por valor .

Python pasa referencias a objetos por valor (como Java), y todo en Python es un objeto. Esto suena simple, pero luego notará que algunos tipos de datos parecen exhibir características de paso por valor, mientras que otros parecen actuar como referencias pasadas ... ¿cuál es el problema?

Es importante comprender los objetos mutables e inmutables. Algunos objetos, como cuerdas, tuplas y números, son inmutables. Alterarlos dentro de una función / método creará una nueva instancia y la instancia original fuera de la función / método no cambiará. Otros objetos, como listas y diccionarios, son mutables, lo que significa que puede cambiar el objeto in situ. Por lo tanto, alterar un objeto dentro de una función / método también cambiará el objeto original en el exterior.


Se pasa una referencia, pero si el parámetro es un objeto inmutable, modificarlo dentro del método creará una nueva instancia.

Aquí hay un hilo sobre el tema.


También recomendaría mirar el módulo de copy :

Documentación de Python para copiar

Le ayudará a comprender los problemas subyacentes y cómo usarlo para realizar su propia copia profunda.