2017-09-24 3 views
0

Lorsque j'indexe de nouveaux objets dans ma liste, l'objet ajouté le plus récent est copié dans tous les objets ajoutés précédemment de la liste. J'ai un petit programme Python fonctionnant sur un RPI3 prenant l'entrée de 4 boutons.list.append et list.expand nouvel objet copié sur toutes les entrées précédentes python

full = [] 
    schedule = ['day', 'activity', 'clock'] 
    n = 4 
    def setDay(x): 
     while True: 
      input_state18 = GPIO.input(18) 
      input_state23 = GPIO.input(23) 
      input_state24 = GPIO.input(24) 
      input_state25 = GPIO.input(25) 
      if input_state23 == False: 
        print('Monday') 
        time.sleep(0.2) 
        x[0] = 'Monday' 
        break 
      if input_state18 == False: 
        print('Tuesday') 
        time.sleep(0.2) 
        x[0] = 'Tuesday' 
        break 
      if input_state24 == False: 
        print('Wednesday') 
        time.sleep(0.2) 
        x[0] = 'Wednesday' 
        break 
      if input_state25 == False: 
        print('Thursday') 
        time.sleep(0.2) 
        x[0] = 'Thursday' 
        break 


    def setActivity(x): 
#same as setDay 
    def setClock(x):  
#same as setDay      

    if __name__ == "__main__": 
     i = 0 
     while i < n: 
      setDay(schedule) 
      setActivity(schedule) 
      setClock(schedule) 
      full.insert(i, schedule) 
      i += 1 
     #put schedule into first spot in total list 
    print(full) 

Quand je lance le programme que je reçois la sortie suivante dans mon terminal:

Monday 
Study 
19:00 
Tuesday 
Training 
17:00 
Monday 
Swimming 
19:00 
Thursday 
Training 
17:00 
[['Thursday', 'Training', '17:00'], ['Thursday', 'Training', '17:00'], ['Thursday', 'Training', '17:00'], ['Thursday', 'Training', '17:00']] 

Le problème se situe autour de ma boucle while dans la fonction principale. J'ai essayé d'utiliser list.append aussi mais j'ai eu la même sortie. Comment changer ma boucle while pour que les listes ajoutées ne remplacent pas la précédente?

+0

vous réutilisez la même liste encore et encore. Créez une * nouvelle * liste à chaque itération (déplacez 'schedule = [...]' dans la boucle) ou créez une copie (voir la copie). –

Répondre

0

Il y a beaucoup de nettoyage requis dans ce code. Mais la meilleure façon en ce moment pour le faire fonctionner de façon à obtenir la sortie désirée est:

while i < n: 
     # Defined within the while loop 
     schedule = ['day', 'activity', 'clock'] 
     setDay(schedule) 
     setActivity(schedule) 
     setClock(schedule) 
     full.insert(i, schedule) 

Parce que, en ce moment vous passez à nouveau la même référence de la liste des fonctions, et en ajoutant la même liste à la full liste. Au lieu de cela, vous avez besoin d'un nouvel élément de liste chaque fois que vous devriez ajouter au full. L'ajout de `schedule` ne crée pas de copie;

+0

assez nouveau pour le codage, donc serait heureux d'ici votre critique de nettoyage. –

0

Les listes sont pour la plupart traitées à l'aide de références, ainsi l'ajout ne copiera pas le schedule, il ajoutera simplement sa référence.

Une astuce à ce sujet est l'utilisation de la copie du module.

import copy 

full.insert(i, copy.deepcopy(schedule)) 

Ceci ajoutera toujours une référence, mais une référence à l'objet copié. Cela devrait probablement vous aider dans ce cas