2016-03-15 2 views
0

En classe, disons que j'ai une instancePython: Comment désindexer une variable d'une instance dans une classe?

self.my_instance=6 

Ensuite, dans une méthode, dire que j'ai quelque chose comme

my_variable=self.my_instance 

Chaque fois que je change my_variable à une autre valeur, self.my_instance change sa valeur aussi, et ce n'est pas ce que je veux. Je veux modifier my_variable sans affecter self.my_instance. Cela peut être assez frustrant et déroutant dans les grands programmes aussi.

Merci!

+0

Pouvez-vous donner un exemple de ce comportement? À moins que vous ne modifiiez l'objet réel tel que 'my_variable.append (4)' si 'my_variable' est une liste,' self.myinstance' ne devrait pas être changé. – zondo

+0

Oui! my_variable EST une liste, et j'essaye d'ajouter self.my_instance, qui est aussi une liste. Savez-vous comment s'y prendre? –

+0

Oui. Dites 'my_variable = self.myinstance [:]' au lieu de 'my_variable = self.myinstance' Cela créera une copie de la liste. – zondo

Répondre

2

Lorsque vous dites my_variable = self.myinstance, my_variable est maintenant juste un alias à l'objet que self.myinstance se réfère à. Pour en faire un objet distinct, vous pouvez utiliser tranchage:

my_variable = self.myinstance[:] 

En utilisant des moyens self.myinstance[:] de prendre tous les objets du début à la fin ce qui signifie tout. Comme il s'agit d'une tranche, cependant, il renvoie une copie, c'est donc un moyen courant d'obtenir une copie d'une liste.

Cela fonctionne dans votre cas parce que my_variable est une liste, mais si elle est un dictionnaire, par exemple, vous pouvez utiliser le module copy:

import copy 

my_variable = copy.copy(self.myinstance) # Shallow copy 

ou

my_variable = copy.deepcopy(self.myinstance) # Deep copy 

dictionnaires ont également la méthode .copy() pour les copies superficielles.

+0

Et si 'self.myinstance' est un autre type mutable qui ne peut pas être découpé comme ça, vous pouvez utiliser [le module' copy'] (https://docs.python.org/3/library/copy.html) fonctions 'copy' ou' deepcopy', selon le cas. – ShadowRanger

+0

@ShadowRanger: Merci d'avoir signalé cela. J'ai ajouté cela. – zondo