Ir al contenido principal

8.11. Alias (poner sobrenombres)

Como las variables apuntan a objetos, si asigna una variable a otra, ambas variables se refieren al mismo objeto:

   1: >>> a = [1, 2, 3]
   2: >>> b = a

En este caso, el diagrama de estados sería como este:


Sin título


Como la misma lista tiene dos nombres diferentes, a y b, podemos decir que se le ha puesto un alias. Los cambios hechos a un alias afectan al otro:




   1: >>> b[0] = 5
   2: >>> print a
   3: [5, 2, 3]

Aunque este comportamiento puede ser útil, a veces es inesperado o indeseable.
En general, es mas seguro evitar los alias cuando trabajemos con objetos mutables. Por supuesto, no hay problema con los objetos inmutables. Por ello Python se toma la libertad de poner alias a las cadenas cuando ve una oportunidad de economizar.

Comentarios

Entradas populares de este blog

C.3. Cartas, mazos y juegos Python

1: import random 2:class Carta: 3: listaDePalos = ["Tr¶eboles", "Diamantes", "Corazones", 4:"Picas"] 5: listaDeValores = ["nada", "As", "2", "3", "4", "5", "6", "7", 6:"8", "9", "10", "Sota", "Reina", "Rey"] 7: 8: def __init__(self, palo=0, valor=0): 9: self.palo = palo 10: self.valor = valor 11: def __str__(self): 12:return (self.listaDeValores[self.valor] + " de " +\ 13: self.listaDePalos[self.palo]) 14: def __cmp__(self, otro): 15: # controlar el palo 16:if self.palo > otro.palo: return 1 17:if self.palo < otro.palo: return -1 18: # si son del mismo palo, controlar el valor 19:if self.valor > otro.valor: return 1 20:if self.valor < otro.valor: return -1 21: # los valores son iguales, es…

B.3. Algoritmo de Euclides Python

En el ejemplo anterior, computamos la suma de 5=6 + 5=6 y obtuvimos 60=36. Es correcto, pero no es la mejor forma de representar la respuesta. Para reducir la fracción a su expresión mas simple, hemos de dividir el numerador y el denominador por el máximo común divisor (MCD) de ambos, que es 12. El resultado sería 5=3. En general, siempre que creamos un nuevo objeto Fracción, deber³amos reducirlo dividiendo el numerador y el denominador por el MCD de ambos. Si la fracción ya esta reducida, el MCD es 1.
Euclides de Alejandr³a (aprox. 325{265 a. C.) presento un algoritmo para encontrar el MCD de dos números enfermos m y n: Si n divide a m sin resto, entonces n es el MCD. De lo contrario, el MCD es el MCD de n y el resto de dividir m entre n. Esta definición recursiva puede expresarse concisamente como una función:
1: def mcd (m, n): 2:if m % n == 0: 3:return n 4:else: 5:return mcd(n, m%n)


En la primera l³nea del cuerpo, usamos el operador de modulo para comprobar la divisibili…

B.2. Suma de fracciones Python

La suma es mas complicada que la multiplicación, pero aun es llevadera. La suma de a=b y c=d es la fracción (a*d+c*b)/b*d.
Usando como modelo el código de la multiplicación, podemos escribir __add__ y __radd__:
class Fracción:... def __add__(self, otro):if type(otro) == type(5): otro = Fracción(otro)return Fracción(self.numerador * otro.denominador + self.denominador * otro.numerador, self.denominador * otro.denominador) __radd__ = __add__
Podemos probar estos métodos con Fracciones y enteros.


>;>> print Fracción(5,6) + Fracción(5,6)60/36>;>> print Fracción(5,6) + 323/6>;>> print 2 + Fracción(5,6)17/6
Los dos primeros ejemplos llaman a __add__ ; el ultimo llama a __radd__ .