valor una referencia recibir procedimientos por paso pasar parametros parametro omision lista funciones como python arrays numpy

python - una - ¿Las matrices numpy se pasan por referencia?



paso por valor y referencia (2)

En Python, todos los nombres de variables son referencias a valores .

Cuando Python evalúa una tarea, el lado derecho se evalúa antes que el lado izquierdo . arr - 3 crea una nueva matriz; no modifica arr en el lugar.

arr = arr - 3 hace que la variable local arr haga referencia a esta nueva matriz. No modifica el valor referenciado originalmente por arr que se pasó a foo . El nombre de variable arr simplemente se une a la nueva matriz, arr - 3 . Además, arr es un nombre de variable local en el ámbito de la función foo . Una vez que se completa la función foo , ya no hay más referencia a arr y Python es libre de recolectar el valor al que hace referencia. Como señala Reti43 , para que el valor de arr afecte a a, foo debe devolver arr y a debe asignarse a ese valor:

def foo(arr): arr = arr - 3 return arr # or simply combine both lines into `return arr - 3` a = foo(a)

Por el contrario, arr -= 3 , que Python traduce en una llamada al método especial __iadd__ , modifica la matriz referenciada por arr en el lugar.

Me encontré con el hecho de que numpy matrices numpy se pasan por referencia en varios lugares, pero luego cuando ejecuto el siguiente código, ¿por qué hay una diferencia entre el comportamiento de foo y la bar

import numpy as np def foo(arr): arr = arr - 3 def bar(arr): arr -= 3 a = np.array([3, 4, 5]) foo(a) print a # prints [3, 4, 5] bar(a) print a # prints [0, 1, 2]

Estoy usando Python 2.7 y numpy versión 1.6.1


La primera función calcula (arr - 3) , luego le asigna el nombre local arr , que no afecta los datos de la matriz que se pasaron. Mi conjetura es que en la segunda función, np.array anula el operador -= y opera en su lugar en la matriz de datos.