Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 19/10/2019, à 19: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, à 20: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, à 20: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, à 21: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, à 22: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 ! smile smile

Hors ligne