Una pregunta simple, tal vez, pero no puedo pronunciar mi consulta de Google para encontrar la respuesta aquí. He tenido el hábito de hacer copias de los objetos cuando los paso en objetos constructores, así:¿Python copia el valor o la referencia en la instanciación de objetos?
...
def __init__(self, name):
self._name = name[:]
...
Sin embargo, cuando me encontré con el siguiente código de prueba, parece no ser necesario, que Python está haciendo copias en profundidad de los valores de los objetos sobre instancias de objetos:
>>> class Candy(object):
... def __init__(self, flavor):
... self.flavor = flavor
...
>>> flav = "cherry"
>>> a = Candy(flav)
>>> a
<__main__.Candy object at 0x00CA4670>
>>> a.flavor
'cherry'
>>> flav += ' and grape'
>>> flav
'cherry and grape'
>>> a.flavor
'cherry'
Así que, ¿cuál es la verdadera historia aquí? ¡Gracias!
EDIT:
Gracias a @Olivier por su gran respuesta. El siguiente código documenta un ejemplo mejor que Python no copiar por referencia:
>>> flav = ['a','b']
>>> a = Candy(flav)
>>> a.flavor
['a', 'b']
>>> flav[1] = 'c'
>>> flav
['a', 'c']
>>> a.flavor
['a', 'c']
Para aclarar, 'self.flavor = flavor' no copia por referencia, pero como las cadenas son inmutables, el objeto al que se hace referencia no se puede cambiar. Por lo tanto, 'flav + = 'y grape' en realidad crea un nuevo objeto de cadena y hace que' flav' lo haga referencia. – taleinat
@taleinat: gracias, actualicé la respuesta, esperando que no llegue a ser confusa. –
Gracias chicos por sus respuestas. Supongo que entonces, todavía me pregunto si copiar objetos en una instanciación es una buena idea, ya que no veo muchos lugares donde se hace. Alguna sugerencia? – daveslab