REVIT ARCHITECTURE (937) – PYTHON – Funciones (21) – Interacción de la función con sus argumentos

En este artículo se va a explicar  cómo interactúa la función con sus argumentos.

El código de la siguiente función servirá para explicar este funcionamiento.

7275

  • Definición de la función:

7276

Aquí se define una función llamada my_function que toma un argumento n.

  • Cuerpo de la función:

print(«yo tenía», n): Esta línea imprime el valor de n que se pasa a la función con el mensaje «yo tenía».
n += 1: Esta línea incrementa el valor de n en 1. Sin embargo, este cambio es local a la función y no afecta el valor de n fuera de ella.
print(«yo tengo», n): Esta línea imprime el nuevo valor de n después de haber sido incrementado con el mensaje «yo tengo».

  • Llamada a la función:

7277

var = 1: Aquí se asigna el valor 1 a la variable var.
my_function(var): Se llama a my_function con var como argumento. Dentro de la función, n tomará el valor de var, que es 1.

  • Salida de la función:

Cuando se llama a my_function(var), la función imprime:

7278

Esto muestra que n inicialmente es 1 (el valor de var), y después de incrementarlo, n se convierte en 2.

  • Impresión del valor de var fuera de la función:

7279

Esta línea imprime el valor de var después de que se ha llamado a la función. La salida es:

7280

Esto demuestra que el valor de var no ha cambiado fuera de la función, ya que el incremento de n dentro de la función no afecta a var.

El funcionamiento resumido es:
La función my_function recibe un argumento n, imprime su valor inicial, lo incrementa y luego imprime el nuevo valor.
El incremento de n dentro de la función no afecta al valor de var fuera de la función.
Esto demuestra que en Python, los valores de los parámetros escalares (como enteros) se pasan a las funciones por valor, lo que significa que la función trabaja con una copia del argumento y no con el argumento en sí mismo. Por lo tanto, cualquier cambio realizado en el parámetro dentro de la función no afecta el argumento original fuera de la función.

Ahora se comprobará cómo funciona con listas ( se ha de tener presente las peculiaridades de asignar cortes de listas frente a asignar listas completas).

El siguiente ejemplo mostrará el funcionamiento de las listas:

7281

  • Definición de la función:

7282

Se define una función llamada mi_funcion que toma un argumento mi_lista_A.

  • Cuerpo de la función:

print(«Impresión #A:», mi_lista_A): Imprime el valor de mi_lista_A que se pasa a la función.
print(«Impresión #B:», mi_lista_B): Imprime el valor de mi_lista_B. Aquí es importante notar que mi_lista_B es una variable global en el contexto de la función, lo que significa que puede ser accedida dentro de la función.
mi_lista_A = [0, 1]: Asigna una nueva lista [0, 1] a mi_lista_A. Esta asignación no afecta la lista original pasada como argumento (en este caso, mi_lista_B), sino que crea una nueva lista dentro de la función.
print(«Impresión #C:», mi_lista_A): Imprime el nuevo valor de mi_lista_A después de la asignación.
print(«Impresión #D:», mi_lista_B): Imprime el valor de mi_lista_B nuevamente, que no ha cambiado porque la reasignación de mi_lista_A no afecta a mi_lista_B.

  • Inicialización y llamada a la función:

7283

mi_lista_B = [2, 3]: Se asigna una lista [2, 3] a la variable mi_lista_B.
mi_funcion(mi_lista_B): Se llama a mi_funcion con mi_lista_B como argumento. Dentro de la función, mi_lista_A tomará el valor de mi_lista_B, que es [2, 3].

  • Salida de la función:

Cuando se llama a mi_funcion(mi_lista_B), la función imprime:

7284

Impresión #A muestra el valor inicial de mi_lista_A, que es [2, 3].
Impresión #B muestra el valor de mi_lista_B, que es [2, 3].
Impresión #C muestra el nuevo valor de mi_lista_A después de la reasignación, que es [0, 1].
Impresión #D muestra que mi_lista_B sigue siendo [2, 3], ya que la reasignación de mi_lista_A no afecta a mi_lista_B.

  • Impresión del valor de mi_lista_B fuera de la función:

7285

Esta línea imprime el valor de mi_lista_B después de que se ha llamado a la función. La salida es:

7286

Esto demuestra que mi_lista_B no ha cambiado fuera de la función, ya que la reasignación de mi_lista_A dentro de la función no afecta a mi_lista_B.

Los pasos principales del funcionamiento son:
La función mi_funcion recibe un argumento mi_lista_A, imprime su valor inicial y el de una variable global mi_lista_B.
Dentro de la función, mi_lista_A se reasigna a una nueva lista [0, 1], pero esta reasignación no afecta la lista original mi_lista_B.
La impresión de mi_lista_B dentro y fuera de la función muestra que mi_lista_B no ha cambiado debido a la reasignación de mi_lista_A dentro de la función.
Esto demuestra que en Python, cuando se pasa una lista a una función, la función recibe una referencia a la lista, pero reasignar la referencia no afecta a la lista original fuera de la función.

Parte 3: Modificación de una lista dentro de la función

El tercer fragmento de código es:

7287

  • Definición de la función:

7288

print(«Impresión #A:», mi_lista_A): Imprime el valor inicial de mi_lista_A.
print(«Impresión #B:», mi_lista_B): Imprime el valor de mi_lista_B.
del mi_lista_A[0]: Elimina el primer elemento de mi_lista_A.
print(«Impresión #C:», mi_lista_A): Imprime el valor de mi_lista_A después de la eliminación.
print(«Impresión #D:», mi_lista_B): Imprime el valor de mi_lista_B.

  • Llamada a la función:

7289

mi_lista_B = [2, 3]: Se asigna una lista [2, 3] a la variable mi_lista_B.
mi_funcion(mi_lista_B): Se llama a mi_funcion con mi_lista_B como argumento.
print(«Impresión #E:», mi_lista_B): Imprime el valor de mi_lista_B después de la llamada a la función.

  • Salida del código:

7290

Modificar la lista a través del parámetro mi_lista_A (por ejemplo, eliminando un elemento) afecta a la lista original mi_lista_B pasada como argumento. Esto se debe a que en Python, las listas se pasan por referencia. Por lo tanto, cualquier modificación a la lista dentro de la función se refleja en la lista original fuera de la función.

Es decir:

Si el argumento es una lista, cambiar el valor del parámetro correspondiente no afecta a la lista (recuerda: las variables que contienen listas se almacenan de manera diferente a los escalares),
pero si cambias una lista identificada por el parámetro (nota: la lista, no el parámetro), la lista reflejará el cambio.

Licencia Creative Commons Contenido Web de Yolanda Muriel está sujeto bajo Licencia Creative Commons Atribución-NoComercial-SinDerivadas 3.0 Unported.

Deja un comentario