Une question simple, peut-être, mais je ne peux pas tout à fait exprimer ma requête Google pour trouver la réponse ici. J'ai eu l'habitude de faire des copies d'objets quand comme si je les passe dans les constructeurs d'objets,:Python copie-t-il une valeur ou une référence lors de l'instanciation de l'objet?
...
def __init__(self, name):
self._name = name[:]
...
Cependant, quand je courais le code de test suivant, il semble ne pas être nécessaire, que Python fait des copies profondes des valeurs d'objet lors de l'instanciation d'objet:
>>> 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'
Alors, quelle est la vraie histoire ici? Merci!
EDIT:
Merci à @Olivier pour sa grande réponse. Le code ci-dessous donne un meilleur exemple que Python ne copie par référence:
>>> flav = ['a','b']
>>> a = Candy(flav)
>>> a.flavor
['a', 'b']
>>> flav[1] = 'c'
>>> flav
['a', 'c']
>>> a.flavor
['a', 'c']
Pour clarifier, 'self.flavour = flavor' copie par référence, mais comme les chaînes sont immuables, l'objet référencé ne peut pas être changé. Par conséquent, 'flav + = 'et grape' crée en fait un nouvel objet chaîne et fait' flav' le référencer. – taleinat
@taleinat: merci, j'ai mis à jour la réponse, en espérant qu'elle ne prête pas à confusion. –
Merci les gars pour vos réponses. Je suppose que je me demande encore si copier des objets lors de l'instanciation est une bonne idée, car je ne vois pas beaucoup d'endroits où cela est fait. Des suggestions là-bas? – daveslab