2009-12-09 6 views
0

Débutant Alerte:Dictionary (même valeur, clé différente)

Je suis nouveau à Python et quand je suis en fait d'ajouter des valeurs à un dict, je trouve que quand je l'impression du tout le dictionnaire, je reçois la même valeur de quelque chose pour toutes les clés d'une clé spécifique.

Cela ressemble à un problème de pointeur?

Voici un extrait en utilisant l'analyseur XML basé sur les événements (SAX):

Fondamentalement avec chaque élément d'extrémité de la « ligne », je stocker l'élément par sa clé: self.Id, où l'auto est l'élément.

def endElement(self, name): 
    if name == "row": 
    self.mapping[self.Id] = self 
    print "Storing...: " + self.DisplayName + " at Id: " + self.Id 

Répondre

4

Vous obtiendrez la valeur self pour chaque entrée unique dans self.mapping, bien sûr, puisque c'est la seule valeur que vous jamais magasin là-bas. Vouliez-vous plutôt prendre une copie/instantané de self ou de certains de ses attributs à ce moment-là, puis modifier self avant de le stocker à nouveau ...?

Modifier: comme l'OP a précisé (dans les commentaires) qu'ils ne doivent en effet prendre une copie:

import copy 

... 

    self.mapping[self.Id] = copy.copy(self) 

ou, utilisez copy.deepcopy(self) si self a, parmi ses attributs, des dictionnaires, des listes, etc. qui doit être copié récursivement (cela inclurait bien sûr self.mapping, ce qui donne des résultats assez particuliers - si le copy.copy normal et peu profond n'est pas suffisant, il vaut probablement la peine d'ajouter la méthode spéciale à la classe de self pour personnaliser la copie profonde, pour éviter l'explosion de copies de copies de copies de ... qui en résulteraient normalement ;-).

+0

J'utilise un analyseur de sax, donc endElement est appelé chaque fois que la fin d'un élément est atteint ... J'essaie de stocker l'élément à son Id –

+0

Alex, merci, oui c'est ce que je voulais dire. Comment attribuer une "copie" à la place d'une "référence"? –

+1

'import copy' et stocke' copy.copy (self) '(ou' copy.deepcopy (self) 'si vous avez besoin de copies récursives de tous les conteneurs que vous avez comme attributs: listes, dicts, etc). –

2

Si je comprends ce que vous dites, alors c'est probablement un comportement attendu. Lorsque vous effectuez une assignation en Python, vous attribuez simplement la référence (un peu comme un pointeur). Lorsque vous faites:

self.mapping[self.Id] = self 

alors les futurs changements à self seront reflétés dans la valeur de cette cartographie que vous venez de faire. Python ne "copie" pas les objets (sauf si vous écrivez spécifiquement du code pour le faire), il n'assigne que des références.

+0

Ah exactement ce que j'avais pensé, merci! –

+0

Si vous voulez copier la valeur, consultez le module de copie – zdav

Questions connexes