Je travaille donc sur un projet où j'ai une liste d'objets. Je voudrais filtrer la liste en fonction d'un attribut d'objet, mais comme cette liste est utilisée à de nombreux autres endroits de mon code, je ne peux pas créer une nouvelle liste car cela créera des problèmes ailleurs dans mes codes.

J'ai essayé d'utiliser ceci:

individuals = list(filter(lambda x: x.waterstore > 0, individuals))

Mais cela me donne "UnboundLocalError: variable locale 'individus' référencée avant affectation".

Voici le code où le problème se produit.

def day(numberOfDays):
   days = 0
   while days < numberOfDays:
       print(str(days) + " days")
       child = randint(1,100)
       if child > 95:
           IndividualGenerator(randint(1,2))
       SeekWaterHole(individuals, lakes)
       rain(lakes)
       DrinkWater(individuals, lakes)
       for r in range(len(individuals)):
           individuals[r].waterstore -= 1
       individuals = list(filter(lambda x: x.waterstore > 0,individuals))
       individualTotalWater = []
       for i in individuals:
           individualTotalWater.append(i.waterstore)
       AmountWater = lakes[0].water
       Logg = [AmountWater, sum(individualTotalWater), len(individuals)]
       with open("NewCSVTestFile.csv", "a") as f:
               openfile = csv.writer(f, delimiter=",")
               openfile.writerow(Logg)
       print("logg " + str(Logg))
       print()
       days += 1

Toute suggestion?

0
Ole Kristian 19 mars 2019 à 15:24

2 réponses

Meilleure réponse

"UnboundLocalError: variable locale 'individus' référencée avant affectation".

Votre première référence à individuals se produit ici:

SeekWaterHole(individuals, lakes)

Mais il n'est pas encore défini dans votre fonction, ni donné en entrée à la fonction. Par conséquent, python ne sait pas à quoi il fait référence.

0
brazofuerte 19 mars 2019 à 12:31

Vous pouvez ajouter des individus [] en tant que liste vide juste avant la ligne d'erreur ou vous pouvez initialiser des individus en tant que global.

from random import randint
def day(numberOfDays):
individuals=''
days = 0
while days < numberOfDays:
    print(str(days) + " days")
    child = randint(1,100)
    #if child > 95:
        #IndividualGenerator(randint(1,2))
    individuals=[]//initialize the list before using it
    #SeekWaterHole(individuals, lakes)
    #rain(lakes)
    #DrinkWater(individuals, lakes)
    for r in range(len(individuals)):
        individuals[r].waterstore -= 1
    individuals = list(filter(lambda x: x.waterstore > 0,individuals))
    individualTotalWater = []
    for i in individuals:
        individualTotalWater.append(i.waterstore)
    #AmountWater = lakes[0].water
    #Logg = [AmountWater, sum(individualTotalWater), len(individuals)]
    #with open("NewCSVTestFile.csv", "a") as f:
    #        openfile = csv.writer(f, delimiter=",")
    #        openfile.writerow(Logg)
    #print("logg " + str(Logg))
    print()
    days += 1
day(10)
0
sam 19 mars 2019 à 13:02