1
+ # #05 VALOR Y REFERENCIA
2
+
3
+ """
4
+ * - Muestra ejemplos de asignación de variables "por valor" y "por referencia", según
5
+ * su tipo de dato.
6
+ """
7
+
8
+ # PASO POR VALOR
9
+ # Variables inmutables (se comportan como si fueran "por valor")
10
+ # Los tipos de datos inmutables en Python incluyen int, float, bool, str, tuple.
11
+ # Si modificas una variable de un tipo inmutable, se crea un nuevo objeto en memoria.
12
+
13
+ print ("PASO POR VALOR" )
14
+ # Variables inmutables (int, str)
15
+ a = 10
16
+ b = a # Apunta al mismo valor que a
17
+
18
+ b = 20 # Se crea un nuevo valor, b apunta a otro lugar en memoria
19
+
20
+ print (a ) # 10 (a no ha cambiado)
21
+ print (b ) # 20 (b tiene un nuevo valor)
22
+
23
+ # PASO POR REFERENCIA
24
+ # Variables mutables (se comportan como si fueran "por referencia")
25
+ # Los tipos de datos mutables incluyen list, dict, set. Modificar una variable mutable afecta
26
+ # a todas las referencias que apuntan a ese objeto.
27
+
28
+ print ("PASO POR REFERENCIA" )
29
+ # Variables mutables (listas)
30
+ x = [1 , 2 , 3 ]
31
+ y = x # y apunta al mismo espacio en memoria de x
32
+
33
+ y .append (4 ) # Modifica la lista a la que ambos apuntan
34
+
35
+ print (x ) # Output: [1, 2, 3, 4] (x ha cambiado)
36
+ print (y ) # Output: [1, 2, 3, 4] (y también ha cambiado)
37
+
38
+
39
+ """
40
+ * - Muestra ejemplos de funciones con variables que se les pasan "por valor" y
41
+ * "por referencia", y cómo se comportan en cada caso en el momento de ser modificadas.
42
+ * (Entender estos conceptos es algo esencial en la gran mayoría de lenguajes)
43
+ *
44
+ """
45
+
46
+ # Función con inmutables (se comportan como si fueran "por valor")
47
+ # Cuando pasas un tipo inmutable a una función, cualquier modificación dentro de la función no # afectará al valor original fuera de la función.
48
+
49
+ print ("\n Funciones: Paso por Valor vs Referencia" )
50
+
51
+ print ("PASO POR VALOR" )
52
+
53
+ def modificar_numero (n ):
54
+ n = 100 # Se asigna un nuevo valor a n
55
+ print (f"Valor dentro de la función: { n } " ) # # Valor dentro de la función: 100
56
+
57
+ numero = 10
58
+ modificar_numero (numero )
59
+ print (f"Valor fuera de la función: { numero } " ) # Valor fuera de la función: 10
60
+
61
+ # Función con mutables (se comportan como si fueran "por referencia")
62
+ # Cuando pasas un tipo mutable a una función, las modificaciones dentro de la función
63
+ # afectarán al objeto original.
64
+
65
+ print ("PASO POR REFERENCIA" )
66
+
67
+ def modificar_lista (lista ):
68
+ lista .append (100 ) # Modifica la lista original
69
+
70
+ mi_lista = [1 , 2 , 3 ]
71
+ modificar_lista (mi_lista )
72
+ print (mi_lista ) # [1, 2, 3, 100] (la lista ha sido modificada)
73
+
74
+
75
+ """
76
+ * DIFICULTAD EXTRA (opcional):
77
+ * Crea dos programas que reciban dos parámetros (cada uno) definidos como variables anteriormente.
78
+ * - Cada programa recibe, en un caso, dos parámetros por valor, y en otro caso, por referencia.
79
+ * Estos parámetros los intercambia entre ellos en su interior, los retorna, y su retorno
80
+ * se asigna a dos variables diferentes a las originales. A continuación, imprime el valor de las
81
+ * variables originales y las nuevas, comprobando que se ha invertido su valor en las segundas.
82
+ * Comprueba también que se ha conservado el valor original en las primeras.
83
+ */
84
+ """
85
+
86
+ print ("\n EXTRA" )
87
+ # POR VALOR
88
+ print ("POR VALOR" )
89
+ def values_exchange (value1 , value2 ):
90
+ temp = value1 # Guarda temporalmente el valor de value1
91
+ value1 = value2 # Asigna el valor de value2 a value1
92
+ value2 = temp # Asigna el valor temporal (el original de value1) a value2
93
+ return value1 , value2
94
+
95
+ num1 = 10
96
+ num2 = 15
97
+ print (f"Valor original num1: { num1 } " )
98
+ print (f"Valor original num2: { num2 } " )
99
+
100
+ inter_num1 , inter_num2 = values_exchange (num1 , num2 )
101
+ print (f"Valor intercambio num1: { inter_num1 } " )
102
+ print (f"Valor intercambio num2: { inter_num2 } " )
103
+
104
+ # POR REFERENCIA
105
+ print ("\n POR REFERENCIA" )
106
+
107
+ def reference_exchange (value1 , value2 ):
108
+ # Intercambiar el contenido de los argumentos mutables
109
+ value1 [:], value2 [:] = value2 [:], value1 [:] # Asignación por slice para modificar in-place
110
+ return value1 , value2
111
+
112
+
113
+ numbers = [num for num in range (10 ) if num % 2 == 0 ] # Numeros pares entre 0 y 10
114
+ fruits = ["naranja" , "melon" , "manzana" ] # Lista de frutas
115
+ print (f"Valor original numbers: { numbers } " )
116
+ print (f"Valor original fruits: { fruits } " )
117
+ inter_value1 , inter_value2 = reference_exchange (numbers , fruits )
118
+ print (f"Valor intercambio numbers: { inter_value1 } " )
119
+ print (f"Valor intercambio fruits: { inter_value2 } " )
0 commit comments