Problème dictionnaire dans une classe

Résolu
elademri Messages postés 18 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 15 avril 2009 - 17 mars 2009 à 19:38
elademri Messages postés 18 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 15 avril 2009 - 15 avril 2009 à 21:31
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
A voir également:

4 réponses

cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
20 mars 2009 à 18:10
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.
3
aera group Messages postés 382 Date d'inscription mercredi 23 août 2006 Statut Membre Dernière intervention 8 novembre 2010 18
6 avril 2009 à 20:25
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
3
elademri Messages postés 18 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 15 avril 2009
17 mars 2009 à 20:35
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
0
elademri Messages postés 18 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 15 avril 2009
15 avril 2009 à 21:31
Merci de vos réponses !
0
Rejoignez-nous