2010-08-10 28 views
-1

Je suis novice en programmation et en Python. Le problème que j'ai est avec la suppression des éléments de la liste qui sont des instances de la classe personnalisée.Copie d'instance de classe personnalisée

import copy 

class some_class: 
    pass 

x = some_class() 
x.attr1 = 5 
y = some_class() 
y.attr1 = 5 

z = [x,y] 
zcopy = copy.deepcopy(z) 
z.remove(zcopy[0]) 

Ce retour: ValueError: list.remove (x): x pas dans la liste

est-il un moyen simple de supprimer l'élément de la liste en utilisant la référence de la liste deepcopied?

edit: Merci pour vos réponses. J'ai trouvé une solution en utilisant l'indexation. Ce n'est pas jolie, mais il fait le travail:

import copy 

class some_class: 
    pass 

x = some_class() 
x.attr1 = 5 
y = some_class() 
y.attr1 = 5 

z = [x,y] 
zcopy = copy.deepcopy(z) 
del z[zcopy.index(zcopy[0])] 
+2

Vous devriez éviter ce type de copie. Il peut y avoir des moyens plus simples de partitionner une liste. Qu'essayez-vous de faire? –

+0

Fondamentalement, j'utilise des fonctions qui, lorsqu'elles sont appliquées, modifient cette liste en effectuant des calculs (une sorte de simulation de Monte Carlo). Donc, je veux utiliser des fonctions sur une copie de l'instance et supprimer la réponse (que j'ai obtenue en exécutant la simulation) de la liste originale afin que je puisse réexécuter la simulation sur la liste modifiée. liste -> fonction (copie de liste) -> réponse -> supprimer la réponse de la liste originale -> fonction (copie de la liste avec la réponse supprimée) -> ... – declain

+1

Ce n'est pas un très bon design. Vous ne devriez pas mettre les réponses dans la même liste. Vous devez filtrer, créer une nouvelle liste, ne pas mettre à jour une liste existante. Et vous avez rarement besoin de copier quoi que ce soit. Vous devriez poster plus de détails sur votre algorithme afin que nous puissions vous aider à le réparer. –

Répondre

1

Non, parce que l'appel à deepcopy crée une copie de l'instance some_class. Cette copie, zcopy[0] est un objet différent de l'original, z[0], donc lorsque vous essayez de supprimer zcopy[0] de la liste z, il se plaint à juste titre que la copie n'existe pas dans la liste d'origine. De plus, il n'y a pas de lien entre l'objet copié et l'objet original, ce qui est l'intention de deepcopy.

Je suppose que vous pourriez implémenter une méthode __deepcopy__ dans votre classe, qui renvoie une copie qui conserve une référence à l'objet d'origine. Vous pouvez ensuite utiliser cette référence pour obtenir l'objet original, z[0], à partir de la copie, zcopy[0]. Cela me semble plutôt bizarre, et probablement pas une bonne idée. Sans plus d'informations, je suggère simplement d'utiliser copy.copy au lieu de copy.deepcopy.