elademri
Messages postés18Date d'inscriptionlundi 5 juillet 2004StatutMembreDernière intervention15 avril 2009
-
17 mars 2009 à 19:38
elademri
Messages postés18Date d'inscriptionlundi 5 juillet 2004StatutMembreDernière intervention15 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 :
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.
cs_laurent1024
Messages postés987Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention30 août 201225 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.
elademri
Messages postés18Date d'inscriptionlundi 5 juillet 2004StatutMembreDernière intervention15 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)