Initialisation erronée d'un tableau dans une class

Résolu
Blz -  
yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   -

Bonjour à tous,

Je tourne en rond avec un tableau dans une classe. Voici les lignes qui me posent problème :

class tests():
    tab=['', '', '', '', '', '', '', '', '']

    
a = []
for i in range(0, 9):
    a.append(tests())
    for j in range(0, 9):
        a[i].tab[j] = (str(i) + '-' + str(j))

for i in range(0, 9):
    for j in range(0, 9):
        print(i, j, a[i].tab[j])

Tous les tableaux ne sont mis à jour qu'avec les dernières données...

Merci pour votre aide
Linux / Firefox 116.0

3 réponses

  1. PierrotLeFou
     

    Si tu nous expliquais ce que tu veux faire?
    Tu n'as pas de fonction d'instantiation de la classe (__init__)
    Tu te refères toujours à la même instance de tab pour chaque valeur de a
    c'est donc normal de retrouver les mêmes valeurs

    0
  2. Blz
     

    Bonjour,

    merci pour ton aide, je pensais qu'__init__ n'était pas nécessaire... à tort

    je joins  le correctif ci dessous :

    class tests():
        def __init__(self):
            self.tab = []
            
        def addTest(self, valeur):
            self.tab.append(valeur)
        
    a = []
    for i in range(0, 9):
        a.append(tests())
        for j in range(0, 9):
            a[i].addTest(str(i) + '-' + str(j))
    
    for i in range(0, 9):
        for j in range(0, 9):
            print(i, j, a[i].tab[j])
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       

      Le init n'est pas nécessaire.  Ce qui est nécessaire, c'est d'associer chaque tableau à une instance de la classe.

      class tests():
          pass
      
      a = []    
      for i in range(0, 9):
          a.append(tests())
          a[i].tab = []
          for j in range(0, 9):
              a[i].tab.append(str(i) + '-' + str(j))
      
      for i in range(0, 9):
          for j in range(0, 9):
              print(i, j, a[i].tab[j])
      
      0
  3. Blz
     

    Merci pour ton explication.

    Je pensais que l'instanciation de la classe était suffisante pour permettre la modification de toutes les attributs de cette classe.

    Et ton exemple est plus simple ;-)

    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       

      Tu pensais juste.

      Tu avais, surtout, négligé de créer plusieurs tableaux.

      De plus, tu utilisais le même nom (tab) pour un attribut de la classe et pour un attribut des instances de la classe, ce qui est source de confusion.

      Ici, un exemple avec deux noms différents, et une création de tableau pour chaque instance, en ligne 6.

      class tests():
          tabcl=['','','','','','','','','']
      a=[]    
      for i in range(0,9):
          a.append(tests())
          a[i].tab=tests.tabcl.copy()
          for j in range(0,9):
              a[i].tab[j]=(str(i)+'-'+str(j))
      for i in range(0,9):
          for j in range(0,9):
              print(i,j,a[i].tab[j])
      
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         

        Un exemple de confusion en utilisant le même nom de variable pour un attribut d'une classe et pour un attribut d'instances de la classe:

        class testc:
            cl = 123
        print ("testc.cl",testc.cl)
        testc.cl=421
        print("testc.cl=421")
        print("testc.cl",testc.cl)
        a=testc()
        print("a=testc()")
        print ("testc.cl,a.cl",testc.cl,a.cl)
        a.cl=2222
        print("a.cl=2222")
        print ("testc.cl,a.cl",testc.cl,a.cl)
        testc.cl=3333
        print("testc.cl=3333")
        print ("testc.cl,a.cl",testc.cl,a.cl)
        b=testc()
        print("b=testc()")
        print ("testc.cl,b.cl",testc.cl,b.cl)
        
        0