Closed trencoret closed 9 years ago
@bamavrakis @jecastro1 @mrpatiwi @mbucchi
https://docs.python.org/3/library/functions.html#id
Al parecer, el intérprete de Python puede guardar en la misma posición los strings iguales para ahorrar memoria. Como p1
y p2
se llaman igual (Juan Gomez
), entonces las id
de sus nombres son las mismas.
Ahora, los strings en Python son inmutables, así que no se va a modificar uno si modificas "el otro". Sino que tienes que crear un string nuevo y reemplazarlo.
Tengo mis dudas, acabo de probar esto y el id
es distinto para palabras compuestas
>>> a = "algo"
>>> id(a)
4330435056
>>> id("algo")
4330435056
>>> b = "Patricio Lopez"
>>> id(b)
4330442992
>>> id("Patricio Lopez")
4330443056
Si, acabo de comprobar lo mismo, estaba haciendo mal la heredada. Muchas gracias @mrpatiwi por la duda! ahora voy a debugear mi codigo.
@mrpatiwi Tengo un problema.. Trate de quitar toda la informacion que pueda ser problematica. Pero si corres eso, me cambia el disponible de ambos barcos
class Arma:
def __init__(self):
self.disponible = True
def usar(self):
self.disponible = False
class Tomahawk(Arma):
def __init__(self):
Arma.__init__(self)
class Vehiculo:
def __init__(self, armas):
self.armas = armas
class Barco_pequeno(Vehiculo):
def __init__(self, armas = [Tomahawk()]):
Vehiculo.__init__(self,armas= armas)
b1 = Barco_pequeno()
b2 = Barco_pequeno()
print(id(b1))
print(id(b2))
print('s')
print(id(b1.armas[0].disponible))
print(id(b2.armas[0].disponible))
print('s')
b1.armas[0].usar()
print(id(b1.armas[0].disponible))
print(id(b2.armas[0].disponible))
print('s')
class Tomahawk(Arma):
def __init__(self):
super().__init__()
De hecho, si no vas a poner nada en el constructor de una subclase. Puedes omitirlo:
class Tomahawk(Arma):
pass
Este código funciona igual que antes.
Usar el super() y el nombre de la clase creo que es lo mismo, aunque el nombre de la clase es para no heredar dos veces (problema del diamante), pero si solo heredas de una da lo misma... Cambiandolo, igual sigue el problema..
class Arma:
def __init__(self):
self.disponible = True
def usar(self):
self.disponible = False
class Tomahawk(Arma):
pass
class Vehiculo:
def __init__(self, armas):
self.armas = armas
class Barco_pequeno(Vehiculo):
def __init__(self, armas = [Tomahawk()]):
super().__init__(armas= armas)
b1 = Barco_pequeno()
b2 = Barco_pequeno()
print(id(b1))
print(id(b2))
print('s')
print(id(b1.armas[0].disponible))
print(id(b2.armas[0].disponible))
print('s')
b1.armas[0].usar()
print(id(b1.armas[0].disponible))
print(id(b2.armas[0].disponible))
print('s')
class Barco_pequeno(Vehiculo):
def __init__(self, armas=None):
armas = armas if armas else [Tomahawk()]
super().__init__(armas=armas)
Pato, mis respetos jajaj. Muchas gracias! Ahi me funciono.
Saludos
Tengo una duda de heredar en general. Como se crean dos objetos diferentes que tengan las mismas caracteristicas pero que tengan id diferentes? Con el siguiente ejemplo sacado de las clases, si yo creo los dos objetos tienen id diferentes, pero las caracteristicas no. Pregunto esto porque si yo despues le cambio la caracteristica a un objeto, se le cambia la caracterisitica al otro objeto, y no quiero que pase eso. Como lo hago si no? Muchas gracias!