Partage
  • Partager sur Facebook
  • Partager sur Twitter

objets au comportement étrange

j'en modifie un, l'autre est automatiquement modifié

Sujet résolu
    15 décembre 2010 à 16:51:46

    Bonjour,

    aujourd'hui, j'ai créé mes premiers objets python. Jusque là, tout va bien.(pour ceux qui connaissent, il s'agit d'implanter un algo de data mining, mais c'est pas le souci).

    class Regle:#creation de l'objet regle. La regle comporte un membre gauche (qui sera une table de hachage nom de l'attribut +  boolean) et un membre droit (une string)
    
      def __init__(self, mbDroit,mbGauche):
        """Method docstring."""
        self._mbGauche = mbGauche
        self._mbDroit = mbDroit
    
      def printargs(self):
        """Method docstring."""
        print self._mbGauche," = ", self._mbDroit
    
      def get_mbGauche(self):
        return self._mbGauche
    
      def set_mbGauche(self,mbGauche):
        self._mbGauche=mbGauche
    
      def add_mbGauche(self,attribut,valeur):
        self._mbGauche[attribut]=valeur
    


    bon, ensuite je tente d'obtenir deux objets de la classe règle, dont l'un sera modifié, et pas l'autre. Et là, grosse cata:

    def creerRegle(c,ensemble_denomination,POSexp,NEGexp):
      attribut={}
      a=Regle(c,{}) #creation d'une regle r avec un membre gauche vide et un membre droit egal a c
      r=a
      mesure_boucle=[]#tableau des mesures exp pour chaque r_prime
      condition_boucle=False
    
      #a repeter jusque r soit parfaite ie ne couvre aucune instance d'une classe autre que c ou qu'il n'y ait plus d'attribut a utilise
    
      while(not condition_boucle):#tant que la condition d'arret n'est pas verifiee
        r_prime=[]
        mesure_boucle=[]
        for attribut in ensemble_denomination[:-1]:#le -1.
          r_prime.append(a)
          r_prime[-1].add_mbGauche("toto","73")
          #le souci est la:
          r.printargs()
          r_prime[-1].printargs()
          
        
      return r
    


    et en sortie, j'ai... ça:

    {'toto': '73'}  =  yes
    {'toto': '73'}  =  yes


    alors que je m'attendais à:

    {}  =  yes
    {'toto': '73'}  =  yes
    


    j'ai relu les tuto, mais j'ai pas trouvé (en même temps j'avoue que je commence à fatiguer, enfin s'il y a une explication simple, ce serait super sympa de me la communiquer, car là je sais plus...merci d'avance)
    • Partager sur Facebook
    • Partager sur Twitter
      15 décembre 2010 à 17:37:38

      En Python, les variables sont comme des liens que tu crées vers tes valeurs : quand tu fais a = 5, tu attaches le nom "a" à la valeur 5. Quand tu fais r=a dans ton code, tu attaches le même nom au contenu de la variable a. Donc r et a pointent sur la même chose ;)

      Regarde la fonction deepcopy du module copy.
      • Partager sur Facebook
      • Partager sur Twitter
        15 décembre 2010 à 18:53:33

        Citation : Lachésis

        def creerRegle(c,ensemble_denomination,POSexp,NEGexp):
          attribut={}
          a= Regle(c,{}) #creation d'une regle r avec un membre gauche vide et un membre droit egal a c
          r= Regle(c,{})
          mesure_boucle=[]#tableau des mesures exp pour chaque r_prime
          condition_boucle=False
        [etc...]
        

        Sinon, en effet, r va représenter le même élément que a.
        • Partager sur Facebook
        • Partager sur Twitter
        yjltg.
          15 décembre 2010 à 22:18:19

          un grand merci, effectivement j'ignorais totalement cet aspect (et comme j'étais claquée en parcourant les tuto, j'imagine que ça m'avait échappé).

          Ma santé mentale vous remercie ;)
          • Partager sur Facebook
          • Partager sur Twitter

          objets au comportement étrange

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown