Un parámetro es un nombre más dentro del marco de una función. sólo hay que tener en cuenta que si en la invocación se le pasa un valor a ese parámetro, en el marco inicial esa variable ya aparecerá ligada a un valor. Analicemos el siguiente código de ejemplo:
def fun1(a):
print a+1
def fun2(b):
fun1 (b+5)
print "Volvio a fun2"
Con la siguiente ejecución:
>>> fun2(43)
49
Volvio a fun2
En este caso, la ejecución se puede representar de la siguiente manera:
Instrucción | Contexto de fun2 |
Contexto de fun1 |
Resultado impreso |
---|---|---|---|
fun2(43) |
b → 43 |
No existe | - |
fun1(b+5) |
b → 43 |
a → 48 |
- |
print |
b → 43 |
a → 48 |
49 (es decir 48+1) |
print |
b → 43 |
No existe | Volvió a fun2 |
- | No existe | No existe | - |
Cuando se pasan objetos como parámetros, las dos variables hacen referencia al mismo objeto. Eso significa que si el objeto pasado es mutable, cualquier modificación que la función invocada realice sobre su parámetro se reflejará en el argumento de la función llamadora, como se puede ver en el siguiente ejemplo:
def modif(lista):
lista[0]=5
def llama():
ls = [1,2,3,4]
print ls
modif(ls)
print ls
Y esta es la ejecución:
>>> llama()
[1, 2, 3, 4]
[5, 2, 3, 4]
Cuando se invoca a modif(ls)
desde llama, el esquema de la pila es el
siguiente:
- en
modif
:lista → [1,2,3,4]
- en
llama
:ls → [1,2,3,4]
Cuando se modifica la lista desde modif
, el esquema de la pila es el
siguiente:
- en
modif
:lista → [5,2,3,4]
- en
llama
:ls → [5,2,3,4]
Cuando la ejecución vuelve a llama
, ls
seguirá apuntando a la lista
[5, 2, 3, 4]
.
En cambio, cuando el parámetro cambia la referencia que se le pasó por una referencia a otro objeto, el llamador no se entera:
def cambia_ref(lista):
lista=[5,1,2,3,4]
def llama2():
ls=[1,2,3,4]
print ls
cambia_ref(ls)
print ls
>>> llama2()
[1, 2, 3, 4]
[1, 2, 3, 4]
Cuando se invoca a cambia_ref(ls)
desde llama2
, el esquema de la pila
es el siguiente:
- en
cambia_ref
:lista → [1,2,3,4]
- en
llama2
:ls → [1,2,3,4]
Cuando se cambia referencia a la lista desde cambia_ref
, el esquema
de la pila es el siguiente:
- en
cambia_ref
:lista → [5,1,2,3,4]
- en
llama2
:ls → [1,2,3,4]
Cuando la ejecución vuelve a llama2
, ls
seguirá apuntando a la lista
[1, 2, 3, 4]
.