Bonjour à tous,
Je débute en python et j'ai une question concernant le stockage de différentes instances de classes.
J'ai écrit la fonction suivante qui remplit des attributs d'une instance de la classe Piezometer (peu importe ce que cela représente), sur la base de la lecture de lignes d'un fichier d'un fichier texte (je remplis les attributs d'une instance par ligne lue).
Définition de la classe associée :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 def ReadAllPiezometerAttributes(FilePath): ListPiez = [] cpt = 0 with open(FilePath,'r') as fileAtt: data = fileAtt.readline() while data: info = data.split() ListPiez.append(Piezometer(info[3],info[0],info[8],info[7],info[6],info[1],info[10],info[11],info[9])) print(ListPiez[cpt]) data = fileAtt.readline() cpt+=1 print("{} piezos have been stored.".format(len(ListPiez))) for i in range(len(ListPiez)): print(ListPiez[i]) return ListPiez
Mon problème est résumé par l'output obtenu, qui est le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 class Piezometer: def __init__(self, nom, ids, id_mabs, id_layer, id_mintern, bss, x, y, layername): self._name = nom self._id = ids self._id_mabs = id_mabs self._id_layer = id_layer self._id_mintern = id_mintern self._bss = bss self._x = x self._y = y self._layername = layername self._obs_timeserie = {} self._sim_timeserie = {} @classmethod def __str__(self): return "Piezo id : {}, Name : {} ({}) - Model location : ABS {} - ({},{})".format(self._id, self._name,self._bss,self._id_mabs,self._id_layer,self._id_mintern)
J'ai bien du mal à comprendre pourquoi le second parcours de la liste, en fin de fonction, (et a fortiori, la liste retournée par la fonction) ne contient que la dernière instance dupliquée partout ?!?! (alors que la liste semble correctement constituée (cf. le print en cours de boucle).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 Piezo id : 1, Name : Gumery (02606X1013-S1) - Model location : ABS 6044 - (0,6043) Piezo id : 2, Name : Noyen-Sur-Seine (02606X0125-PM3) - Model location : ABS 2737 - (0,2736) Piezo id : 3, Name : Noyen-Sur-Seine (02606X0112-G5) - Model location : ABS 2541 - (0,2540) Piezo id : 4, Name : Mouy-Sur-Seine (02605X0062-M4) - Model location : ABS 160 - (0,159) Piezo id : 5, Name : Rheges (02621X0009-S1) - Model location : ABS 298 - (0,297) Piezo id : 6, Name : Rheges (02621X0085-PZ) - Model location : ABS 298 - (0,297) Piezo id : 7, Name : Nogent-Sur-Aube (02628X0005-P1) - Model location : ABS 241 - (0,240) Piezo id : 8, Name : Chalons-En-Champagne (01891X0047-PZ1) - Model location : ABS 4746 - (0,4745) Piezo id : 9, Name : Asfeld (01082X0015-P-SUD) - Model location : ABS 2923 - (0,2922) Piezo id : 10, Name : Bucy-Le-Loing (01067X0362-BL7) - Model location : ABS 1806 - (0,1805) 10 piezos have been stored. Piezo id : 10, Name : Bucy-Le-Loing (01067X0362-BL7) - Model location : ABS 1806 - (0,1805) Piezo id : 10, Name : Bucy-Le-Loing (01067X0362-BL7) - Model location : ABS 1806 - (0,1805) Piezo id : 10, Name : Bucy-Le-Loing (01067X0362-BL7) - Model location : ABS 1806 - (0,1805) Piezo id : 10, Name : Bucy-Le-Loing (01067X0362-BL7) - Model location : ABS 1806 - (0,1805) Piezo id : 10, Name : Bucy-Le-Loing (01067X0362-BL7) - Model location : ABS 1806 - (0,1805) Piezo id : 10, Name : Bucy-Le-Loing (01067X0362-BL7) - Model location : ABS 1806 - (0,1805) Piezo id : 10, Name : Bucy-Le-Loing (01067X0362-BL7) - Model location : ABS 1806 - (0,1805) Piezo id : 10, Name : Bucy-Le-Loing (01067X0362-BL7) - Model location : ABS 1806 - (0,1805) Piezo id : 10, Name : Bucy-Le-Loing (01067X0362-BL7) - Model location : ABS 1806 - (0,1805) Piezo id : 10, Name : Bucy-Le-Loing (01067X0362-BL7) - Model location : ABS 1806 - (0,1805)
J'espère que l'exemple est assez clair.
Merci beaucoup par avance pour votre aide,
oblivion0-dev
Partager