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.