Algoritmos de Programación con Python

18.2. Pasaje de parámetros

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].


Copyright (c) 2011-2014 Rosita Wachenchauzer, Margarita Manterola, Maximiliano Curia, Marcos Medrano, Nicolás Paez. La copia y redistribución de esta página se permite bajo los términos de la licencia Creative Commons Atribución - Compartir Obras Derivadas Igual 3.0 siempre que se conserve esta nota de copyright.