2010-02-04 5 views
20

J'essaie d'ajouter un objet à une liste mais comme j'ajoute l'objet réel lorsque j'essaie de réinitialiser la liste par la suite, toutes les valeurs de la liste sont réinitialisées. Existe-t-il un moyen réel d'ajouter un objet moniteur à la liste et de modifier les valeurs sans affecter celles que j'ai déjà enregistrées dans la liste?Ajouter un objet à une liste python

Merci

code:

arrayList = [] 

for x in allValues: 


     result = model(x) 

     arrayList.append(wM) 

     wM.reset() 

où EIGD une classe de moniteur - qui est calculé/travaillé dans la méthode du modèle

+3

Je ne comprends pas votre problème. Un simple code montrant ce qui ne va pas pourrait aider. –

+3

Qu'est-ce qu'une "liste de tableaux"? Une 'liste'? –

+0

oui c'est une liste. – Lilz

Répondre

20

est votre problème semblable à ceci:

l = [[0]] * 4 
l[0][0] += 1 
print l # prints "[[1], [1], [1], [1]]" 

Si oui, il vous suffit de copier les objets lorsque vous les stocker:

import copy 
l = [copy.copy(x) for x in [[0]] * 4] 
l[0][0] += 1 
print l # prints "[[1], [0], [0], [0]]" 

Les objets en question doivent mettre en œuvre un __copy__ méthode pour copier des objets. Voir la documentation pour copy. Vous pouvez également être intéressé par copy.deepcopy, qui est là aussi.

EDIT: Voici le problème:

arrayList = [] 
for x in allValues: 
    result = model(x) 
    arrayList.append(wM) # appends the wM object to the list 
    wM.reset()   # clears the wM object 

Vous devez joindre une copie:

import copy 
arrayList = [] 
for x in allValues: 
    result = model(x) 
    arrayList.append(copy.copy(wM)) # appends a copy to the list 
    wM.reset()      # clears the wM object 

Mais je suis encore confus quant à l'endroit où wM vient. Est-ce que vous ne copierez pas le même objet wM encore et encore, sauf que vous le nettoierez après la première fois et que tout le reste sera vide? Ou est-ce que model() modifie le wM (ce qui me semble être un défaut de conception terrible)? Et pourquoi jetez-vous result?

+0

+1 Je suppose que le problème d'OP se rapporte à ceci – ghostdog74

+0

MERCI BEAUCOUP BEAUCOUP :) – Lilz

+0

@Lily - Si vous aviez lu et pensé à ma réponse originale ou à la réponse de ghostdog74, vous auriez pu le faire vous-même. Vous devriez envisager de lire la documentation, en particulier sur les objets immuables et mutables et le module 'copy'. –

2

alors que vous devriez montrer comment votre code ressemble à ça donne le problème, je pense que ce scénario est très commun. Voir copy/deepcopy

+0

+1 pour me battre. –

3

Vous devez créer une copie de la liste avant de modifier son contenu. Un raccourci rapide pour dupliquer une liste est la suivante:

mylist[:] 

Exemple:

>>> first = [1,2,3] 
>>> second = first[:] 
>>> second.append(4) 
>>> first 
[1, 2, 3] 
>>> second 
[1, 2, 3, 4] 

Et pour montrer le comportement par défaut qui modifierait la liste Orignal (depuis un nom en Python est simplement une référence à la objet sous-jacent):

>>> first = [1,2,3] 
>>> second = first 
>>> second.append(4) 
>>> first 
[1, 2, 3, 4] 
>>> second 
[1, 2, 3, 4] 

Notez que cela ne fonctionne que pour les listes. Si vous devez dupliquer le contenu d'un dictionnaire, vous devez utiliser copy.deepcopy() comme suggéré par d'autres.

0

Si j'ai raison de croire que vous ajoutez une variable au tableau mais que vous changez cette variable en dehors du tableau, elle change aussi à l'intérieur du tableau mais vous ne le voulez pas alors c'est vraiment simple Solution. Lorsque vous enregistrez la variable dans la matrice, vous devez la transformer en chaîne en mettant simplement str (variablename).Par exemple:

array.append(str(variablename)) 

En utilisant cette méthode de votre code devrait ressembler à ceci:

arrayList = [] 
for x in allValues: 
    result = model(x) 
    arrayList.append(str(wM))  #this is the only line that is changed. 
    wM.reset() 
+0

Cela me donne une erreur. –

Questions connexes