Problème dictionnaire dans une classe [Résolu]

Signaler
Messages postés
18
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
15 avril 2009
-
Messages postés
18
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
15 avril 2009
-
Bonjour,
Je suis débutant en Python, et je n'ai donc pas consulté toutes les finesses du langage, me reposant sur d'autres connaissances.
Voila une heure que je me prends la tête sur un de mes programmes, et  après tests le problème peut se résumer au code suivant :

>>> class My:
...        dico = {}
...
>>> a1 = My()
>>> a1.dico["name"]="flop"
>>> a2 = My()
>>> a2.dico["name"]="floc"
>>> a1.dico
{'name': 'floc'}
>>> a2.dico
{'name': 'floc'}

Apparemment, le dictionnaire "dico" est partagé par toutes les instances de la classe My, puisque la clé "name" a la valeur "floc" dans les deux cas...
Ce problème n'apparait qu'avec les dictionnaires, de simples chaines ou nombres ne sont pas partagés.

Alors j'aimerais savoir si c'est un bug, ou si le langage est implémenté et documenté comme ça, enfin bref la raison de cet étrange effet ;)
Eventuellement aussi, comment y remédier.

Voila je précise que je bosse en python 2.6.

Merci d'avance

4 réponses

Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
16
Voici quelques élements de réponse :
http://diveintopython.adrahon.org/object_oriented_framework/class_attributes.html
Pour la différence de fonctionnement entre le dictionnaire et l'entier, à mon avis cela vient du fait que, quand tu as un dictionnaire, ton attribut est une référence vers l'objet alors que dans le deuxième cas (avec un entier) c'est un type scalaire.
Messages postés
382
Date d'inscription
mercredi 23 août 2006
Statut
Membre
Dernière intervention
8 novembre 2010
11
class
My:
    def __init__(self):
        self.dico = {}

a1 = My()
a1.dico["name"]="flop"

a2 = My()
a2.dico["name"]="floc"

print a1.dico # >> {'name': 'flop'}
print a2.dico # >> {'name': 'floc'}





Voila
______

Aéra
Messages postés
18
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
15 avril 2009

En cherchant un peu, j'ai pu trouver une "réponse"
En étant initialisé juste après la déclaration de classe (donc hors fonction init), l'attribut dico est considéré comme un "attribut de classe", un peu l'équivalent d'un champ static en java. (sauf qu'on peut modifier ces attributs à partir de n'importe quelle instance de la classe)
Il est donc effectivement partagé par toutes les instances et vaut la dernière valeur qu'on lui a affecté...

... par contre, cette réponse pourrait être satisfaisante si ça marchait pour tous types d'attributs de classe... Bein non, avec un entier ou une chaîne à la place du dictionnaire, par exemple, chaque instance garde sa propre valeur (et la classe en elle-même garde aussi sa propre valeur)

?? des commentaires ? :p
Messages postés
18
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
15 avril 2009

Merci de vos réponses !