2010-08-25 15 views
0

Désolé si le titre n'est pas très clair. Je n'étais pas sûr du titre approprié. Laissez-moi vous expliquer ce dont j'ai besoin. Je fais plusieurs exécutions d'une simulation, où chaque exécution correspond à une graine différente. Cependant, je souhaite que les caractéristiques de départ des instances d'une classe restent les mêmes pour les différentes exécutions. Par exemple, considérons la classe de personnes dans une ville. Dans le code ci-dessous, la commande city = people() crée des objets de personne dont chacun possède une certaine richesse choisie au hasard dans une distribution. Soit F (.) La distribution initiale réalisée de la richesse dans la population. Lorsqu'une simulation est effectuée, les choses changent dans la population et les divers attributs des objets personnels sont mis à jour. Par exemple, le revenu d'une personne change. Les valeurs finales de ces attributs dépendent de certaines réalisations aléatoires qui se produisent pendant l'exécution de la simulation. Maintenant, je veux à nouveau exécuter la simulation avec une graine aléatoire différente, où avant que l'exécution commence tous les attributs sont réinitialisés à leurs valeurs initiales (y compris la distribution de richesse qui a été déterminée au hasard). Dois-je faire une copie superficielle ou une copie en profondeur? Y a-t-il une troisième voie qui soit meilleure?Dois-je faire une copie de l'instance d'une classe pour y parvenir? Si oui, comment puis-je le faire?

Merci beaucoup.

city = people() 

for seedValue in ListOfSeeds: 

    cityThisInstance = city.copy() 

    cityThisInstance.someAttribute = xxxxx 
    cityThisInstance.anotherAttribute = yyyyy 

    Rest of the code 

Répondre

2

D'après ce que je comprends, vous voulez toujours vos conditions initiales (par exemple l'état de city d'avant même d'arriver à votre boucle) soient les mêmes. Si c'est le cas, je préférerais simplement réinitialiser la classe chaque fois que vous parcourez la boucle, car c'est beaucoup plus clair.

initargs = 21, 50000 
initkwargs = {car: 'blue', make: 'mazda'} 

for loop: 
    cityThisInstance = people(*initargs, **initkwargs) 

Si, à chaque initialisation de la classe, une quantité importante de code s'exécute, il peut être préférable de simplement copier son état. Deepcopy serait préféré, de sorte que toutes les variables qu'il utilise seront copiées, en particulier les mutables, plutôt que de pointer vers où les originaux sont.

import copy 

for loop: 
    cityThisInstance = copy.deepcopy(city) 
+0

Merci Nick. Je ne peux pas réinitialiser la classe puisque l'état initial a certaines variables qui ont été déterminées en utilisant la fonction random.uniform. Ces valeurs changeront si je réinitialise en utilisant la première méthode que vous avez suggérée. Mais le second devrait fonctionner. Je vais essayer ça. Merci. – Curious2learn