begin process at 2012 02 08 12:34:36
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Python

 > 

Divers

 > 

Aide et documentation

 > 

Allocation de mémoire et référence


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Allocation de mémoire et référence

jeudi 15 juillet 2010 à 15:41:02 | Allocation de mémoire et référence

benc77

Bonjour,

je vous soumet un problème bizarre de collision de variables :
Dans le code suivant, la méthode __init__ de la classe MySemTree ne semble pas réallouer un nouvel objet à chaque appel, ce qui parait fou...

ceci est illustré par les 3 dernières lignes du code :
* on crée un arbre root
* on appelle une méthode add_branch qui prend root en parametre
* on crée un nouvel arbre dans add_branch
=> et on constate au final que c'est root qui est modifié !

J'ai pu reproduire ce bug avec python 2.7,2.6 et 2.5 compilé sous macosx.
qqun a-t-il une idée ?? pouvez-vous le reproduire ?

merci,
Be.

Code Python :

import sys

class MySemTree:
       
       def __init__(self,label,children=[]):
              self.label = label
              self.children=children
              
       def add_child(self,tree):
              self.children.append(tree)

       def dump(self,skip=3,indent=0):
              s =  self.label+'\n'
              for child in self.children:
                     print child.label
                     #s += child.dump(indent=indent+skip)
              return s

def add_branch(tree,lblist):    
       x = MySemTree(lblist[0])
       x.add_child(MySemTree('o'))
    
def yield_empty_tree():
       return MySemTree('-ROOT-')

root = yield_empty_tree()
add_branch(root,"XXX")
root.dump()


samedi 17 juillet 2010 à 02:35:56 | Re : Allocation de mémoire et référence

Chouchou182

Salut,
La valeur par défaut de la variable children de la fonction __init__ est partagée par toutes les instances de la classe. Bug ou fonctionnalité, je ne connais pas suffisamment python pour me prononcer.

Voir l'exemple ci-dessous:

Code Python :
class bug:
  def __init__(self, data=[]):
    self.data = data

  def push(self, d):
    self.data.append(d)

  def show(self):
    print ' '.join(self.data)

a = bug()
a.push('Hello')
b = bug()
b.push('World!')
c = bug([])
c.push('Seul')

a.show()
b.show()
c.show()


Remède? Supprimer ce '=[]' dans la définition de __init__.

Bonne prog,
--
Chouchou.


Cette discussion est classée dans : self, add, root, def, mysemtree


Répondre à ce message

Sujets en rapport avec ce message

matrice symétrique [ par delaval ] bonjour, je suis actuellement en train d'écrire une fonction symétrique qui renvoie True or False selon la matrice que je rentre. Voici mon code:class [Python3.1.2] Impossible d'utiliser __init__ avec des paramètres [ par titoulaka ] bonjour, j'ai créer une classe avec deux arguments sur le constructeur, lorsque j'essaie de l'utiliser j'ai comme message d'erreur : [quote]>>> b = Recuperer le contenu d'une Entry (Tkinter) [ par Souslannodenime ] Bonjour J'ai un problème. Je n'arrive pas a recuperer le contenu d'une Entry que j'ai crée dans une autre classe. class Fenetre: def __init__(self Comment Afficher les donnes d'une BD dans WXGRID ??? [ par medmst ] slt a tousmon probleme est .. comment afficher les donnees d'un bd dans WXGRID ???mon code-source est : pas d'erreur de compilation mé il n'affiche ri Diverses questions et precision [ par sheorogath ] Bonjour,je me remets au python mais plus serieusement cette fois ci :palors j'ai plusieurs question sur des choses sur lesquels je trouve que peux d'i WXPython, probleme avec un notebook [ par faucheuse ] Par défaut Probleme sizer dans un panel dans un notebook Bonjour à tous, J'ai créer un notebook dans lequel je met plusieurs panel ainsi que un ou pl taquin 4*4 probleme affichage tkinter [ par fredericfabry ] Bonjour je me suis lance dans la resolution du probleme du taquin (puzzle) de4*4 mon programme donne le resultat mais je ne suis pas content car j'ai Appeler une méthode d’objet juste construit / comparaison profonde [ par gaspos ] Bonjour, y a-t-il un moyen d'appeler méthode d'objet juste construit ? <?xml:namespa Question sur PyQt4 !!!!!! [ par Subversion ] Bonjour à vous tous,Voilà, je dois programmer en Python via Eclipse (avec PyDev) afin d'élaborer une interface graphique. De ce fait, je suis en train Checkbutton conservant les paramètres après redemarrage [ par stephane70 ] Bonjour, je reviens sur des problèmes de checkbuttons (si on peut appeler ceci des problèmes ) Voila, j'ai bien mes checkbuttons qui fonctionnent bi


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,825 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales