2016-03-26 5 views
0

Cependant, quand je change de nouveau, il change aussi self._marker. Je veux pouvoir changer de nouveau, sans changer self._marker. Je ne peux pas non plus utiliser deepcopy, puisque je fais cette opération plusieurs milliers de fois, et que je subis une énorme pénalité de performance pour l'utilisation de deepcopy.Comment faire une copie d'une liste sans modifier son contenu?

Que dois-je faire?

+8

Si vous voulez une copie en profondeur, vous devez faire une copie profonde. Et oui, les copies profondes peuvent être chères. Qu'essayez-vous vraiment de faire? (ie je pense que c'est un problème XY) – Claudiu

+0

Note pour faire une copie à deux niveaux de profondeur vous pouvez faire 'new = [l [:] pour l dans self._marker]' – Claudiu

+0

@Claudiu Im essayant de faire une copie de mon attribut _marker pour que je puisse utiliser la copie et la faire muter, mais la prochaine fois que je le ferai, je veux que self._marker reste le même, et ne change pas – Randomuser123

Répondre

0

Vous êtes sur la bonne voie, mais la solution proposée ne fonctionne pas car vous ne faites pas de copie des listes internes. Ils restent les mêmes.

Vous pouvez le faire:

new_list = [e[:] for e in self._marker] 

Ce Performa une deepcopy qui est ce que vous avez besoin dans ce cas.

Cela répond à la question que vous avez posée. Si vous avez d'autres besoins, vous devez les expliciter dans votre question.

+0

OP déjà rejeté cette réponse dans un commentaire à une réponse (maintenant supprimé) – Claudiu

+0

Cela répond à la question cependant. – DevShark

+0

Bien sûr, mais il fait la même chose que deepcopy, et souffre donc du même problème. Aussi c'est déjà [dans les commentaires] (http://stackoverflow.com/questions/36237712/how-do-i-make-a-copy-of-a-list-without-changing-its-contents/36238470?noredirect = 1 # comment60105870_36237712). – Claudiu