#1 Le 19/10/2019, à 18:10
- 19Phugoide
[PYTHON] Problème d'égalité dans les dictionnaires
Bonjour, en programment un algorithme (pour modéliser l'évolution des bancs de poissons), je me suis retrouver face à un problème pour le moins étonnant.
Voici mon code :
import copy
class Grille:
def __init__(self, d_h, instant=None):
self.Dico = {}
def fnt1(dico):
db=copy.deepcopy(dico)
assert db == dico
print(True)
Je définie aussi :
dico1={(0, 2): [0, [ 1.2, 3.6 ], 1.0], (1, 0): [1, [ 3.2, 0.9], 2.8], (0, -2): [2, [ 0.6, -3.6], 0.4]}
dico2=Grille(2,0)
dico2.Dico=dico1
dico3_=Grille(2,0)
dico3_.Dico=dico1
dico3=copy.deepcopy(dico3_)
Et voici la réponse de l'interpréte :
>>> fnt1(dico1)
True
>>> fnt1(dico2)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "C:\Users\Hugo\Documents\etude\2018-2019-2020__PSI\TIPE\python\debug_algo4.py", line 15, in fnt1
assert db == dico
AssertionError
>>> fnt1(dico3)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "C:\Users\Hugo\Documents\etude\2018-2019-2020__PSI\TIPE\python\debug_algo4.py", line 15, in fnt1
assert db == dico
AssertionError
Pourquoi python ne traite pas de la même manière dico1 que dico2 et dico3 ? Je ne vois pas comment faire pour contourner cette difficulté...
Pour plus de précision :
def fnt2(dico):
db=copy.deepcopy(dico)
db2=copy.deepcopy(dico)
ch_db = str(db) ; ch_dico = str(dico) ; ch_db2 = str(db2)
assert type(db) == type(dico) == type(db2) # == dict pour dico1 et == __main__.Grille pour dico2 et dico3
assert (not db is dico) and (not db2 is dico) and (not db2 is db)
assert ch_db == ch_dico == ch_db2
assert db == dico or db2 == dico or db2==db
print(True)
qui donne :
>>> fnt2(dico1)
True
>>> fnt2(dico2)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "C:\Users\Hugo\Documents\etude\2018-2019-2020__PSI\TIPE\python\debug_algo4.py", line 25, in fnt2
assert db == dico or db2 == dico or db2==db
AssertionError
>>> fnt2(dico3)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "C:\Users\Hugo\Documents\etude\2018-2019-2020__PSI\TIPE\python\debug_algo4.py", line 25, in fnt2
assert db == dico or db2 == dico or db2==db
AssertionError
Merci d'avance,
Hugo
Hors ligne
#2 Le 19/10/2019, à 19:08
- Roschan
Re : [PYTHON] Problème d'égalité dans les dictionnaires
Plutôt que d'interrompre le programme avec des assertions, print les contenus des dictionnaires histoire qu'on comprenne ce qui se passe dedans.
"C:\Users\Hugo\Documents\etude\2018-2019-2020__PSI\TIPE\python\debug_algo4.py"
sans commentaire mdr
Hors ligne
#3 Le 19/10/2019, à 19:15
- pingouinux
Re : [PYTHON] Problème d'égalité dans les dictionnaires
Bonsoir,
Il semble que deux instances différentes d'une même classe, avec le même contenu, ne vérifient pas l'égalité.
class Grille:
def __init__(self): pass
gri1=Grille()
gri2=Grille()
gri3=gri1
print("gri1==gri2",gri1==gri2)
print("gri1==gri3",gri1==gri3)
Résultat
gri1==gri2 False
gri1==gri3 True
Hors ligne
#4 Le 19/10/2019, à 20:29
- pingouinux
Re : [PYTHON] Problème d'égalité dans les dictionnaires
Tu peux définir l'opérateur d'égalité dans la classe :
class Grille:
def __init__(self, d_h, instant=None):
self.Dico = {}
def __eq__(self,other):
return self.Dico==other.Dico
Hors ligne
#5 Le 19/10/2019, à 21:34
- 19Phugoide
Re : [PYTHON] Problème d'égalité dans les dictionnaires
Merci beaucoup pingouinux ! Mon programme marche maintenant, ces deux lignes de code change tout !
Hors ligne