1+ # 05
2+ # Variables por valor int, float, str, bool, tuple
3+
4+ # int
5+ a = 10
6+ b = a # b recibe una copia del valor de a
7+
8+ a = 20 # Cambiamos 'a'
9+
10+ print (a ) # 20
11+ print (b ) # 10 → b NO se vio afectada
12+
13+ # str
14+ x = "Hola"
15+ y = x
16+ x = "Chao"
17+
18+ print (x ) # Chao
19+ print (y ) # Hola → no cambia, porque string es INMUTABLE
20+
21+
22+ # Variables por referencia list, dict, set, objetos personalizados
23+
24+ #list
25+ lista1 = [1 , 2 , 3 ]
26+ lista2 = lista1 # lista2 apunta a la MISMA lista en memoria
27+
28+ lista1 .append (4 )
29+
30+ print (lista1 ) # [1, 2, 3, 4]
31+ print (lista2 ) # [1, 2, 3, 4] → también cambió
32+
33+ """se puede evitar la referecia con . copy()"""
34+
35+ lista1 = [1 , 2 , 3 ]
36+ lista2 = lista1 .copy () # o lista2 = lista1[:] o list(lista1)
37+ lista3 = lista1 [:]
38+ lista4 = list (lista1 )
39+
40+ lista1 .append (4 )
41+
42+ print (lista1 ) # [1, 2, 3, 4]
43+ print (lista2 ) # [1, 2, 3]
44+ print (lista3 ) # [1, 2, 3]
45+ print (lista4 ) # [1, 2, 3]
46+
47+ # Ejemplo de referencia en memoria
48+ a = [1 , 2 , 3 ]
49+ b = a
50+
51+ print (id (a )) # 140192940769920 (ejemplo)
52+ print (id (b )) # 140192940769920 → mismo id = MISMO objeto
53+
54+ b = a .copy () # Con copia
55+ print (id (a )) # 140192940769920
56+ print (id (b )) # 140192940770288 → distinto id = OBJETO DIFERENTE
57+
58+ # Funciones por valor
59+ # int
60+ def modificar_numero (x ): # Se crea una copia del valor, no afecta a 'a'
61+ x = x + 10
62+ print ("Dentro de la función:" , x )
63+
64+ a = 5
65+ modificar_numero (a )
66+ print ("Fuera de la función:" , a )
67+
68+ # str
69+ def cambiar_texto (texto ):
70+ texto = texto .upper ()
71+ print ("Dentro de la función:" , texto )
72+
73+ msg = "hola"
74+ cambiar_texto (msg )
75+ print ("Fuera de la función:" , msg )
76+
77+ # funciones por valor
78+ def modificar_lista (lista ):
79+ lista .append (100 ) # La modificación AFECTA al original porque apuntan al mismo objeto en memoria
80+ print ("Dentro de la función:" , lista )
81+
82+ nums = [1 , 2 , 3 ]
83+ modificar_lista (nums )
84+ print ("Fuera de la función:" , nums )
85+
86+ # Evitar que se modifique el original
87+ def modificar_sin_afectar (lista ):
88+ copia = lista .copy () # o lista[:] o list(lista)
89+ copia .append (999 )
90+ print ("Dentro de la función:" , copia )
91+
92+ nums = [1 , 2 , 3 ]
93+ modificar_sin_afectar (nums )
94+ print ("Fuera de la función:" , nums )
95+
96+ # Ejemplo visual de objeto en memoria
97+ def revisar (obj ):
98+ print ("ID dentro:" , id (obj ))
99+
100+ a = [1 ,2 ,3 ]
101+ print ("ID fuera:" , id (a )) # Los IDs coinciden → es el mismo objeto en memoria
102+ revisar (a )
103+
104+ """
105+ ----------------------------------------------------------------------------------------
106+ Tipo de dato - Se modifica fuera de la funcion? - Naturaleza
107+ ----------------------------------------------------------------------------------------
108+ int, float, str, bool, tuple - No cambia - Inmutable por valor
109+
110+ list, dict, set, objetos - Puede cambiar - Mutable por referencia
111+
112+ Para evitarlo - Usar .copy() - se protege el original
113+ ----------------------------------------------------------------------------------------
114+ """
115+
116+ """Ejecicio Extra
117+ Crea dos programas que reciban dos parámetros (cada uno) definidos como variables anteriormente.
118+ """
119+
120+ # Funcion de intercambio por Valor
121+
122+ valor1 = 10
123+ valor2 = "Hola"
124+
125+ # nota si no le añado nada para crear un nuevo objeto, el id no cambia.
126+ def intercam_valor (valor1 , valor2 ):
127+ ax = valor1
128+ valor1 = valor2 + " bro" # <-- aquí se crea una NUEVA cadena
129+ valor2 = ax + 10
130+ return (valor1 , valor2 ) # <-- aquí se crea un NUEVO entero (20)
131+
132+ valor3 , valor4 = intercam_valor (valor1 , valor2 )
133+
134+ print (valor1 , f"Id variable 1: { id (valor1 )} " , valor2 , f"Id variable 2: { id (valor2 )} " )
135+ print (valor3 ,f"Id variable 3: { id (valor3 )} " , valor4 , f"Id variable 4: { id (valor4 )} " )
136+
137+
138+
139+ # Funcion de intercambio por Referencia
140+ valor1 = [1 , 2 , 3 ]
141+ valor2 = [4 , 5 , 6 ]
142+ print (valor1 , f"Id variable 1: { id (valor1 )} " , valor2 , f"Id variable 2: { id (valor2 )} " )
143+
144+ def intercam_valor (x , y ):
145+ y .append (10 )
146+ x .append (100 )
147+ return (x , y )
148+
149+ valor3 , valor4 = intercam_valor (valor1 , valor2 )
150+
151+ print (valor1 , f"Id variable 1: { id (valor1 )} " , valor2 , f"Id variable 2: { id (valor2 )} " )
152+ print (valor3 ,f"Id variable 3: { id (valor3 )} " , valor4 , f"Id variable 4: { id (valor4 )} " )
0 commit comments