2017-09-24 1 views
0

Wenn ich neue Objekte in meine Liste einfüge, kopiert das neueste hinzugefügte Objekt alle zuvor hinzugefügten Objekte der Liste. Ich habe ein kleines Python-Programm, das auf einem RPI3 läuft und Eingaben von 4 Tasten nimmt.list.append und list.expand neue Objektkopien über alle vorherigen Einträge 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) 

Als ich führen Sie das Programm, das ich die folgende Ausgabe in meinem Terminal erhalten:

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']] 

Also das Problem um meine while-Schleife in der Hauptfunktion befindet. Ich habe es auch mit list.append versucht, aber ich habe die gleiche Ausgabe bekommen. Wie ändere ich meine While-Schleife, damit die hinzugefügten Listen nicht die vorherige ersetzen?

+0

Das Anhängen von 'schedule' erstellt keine Kopie; Sie verwenden die gleiche Liste immer wieder. Erstellen Sie eine * neue * Liste für jede Iteration (verschieben Sie 'schedule = [...]' in die Schleife) oder erstellen Sie eine Kopie (siehe das Duplikat). –

Antwort

0

Es ist eine Menge Aufräumarbeiten in diesem Code erforderlich. Aber der einfachste Weg, gerade jetzt, um es so laufen zu lassen, dass Sie die gewünschte Ausgabe erhalten ist:

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

Denn gerade jetzt Sie den gleichen Bezug der Liste Funktionen wieder vorbei sind, und Anfügen die gleiche Liste des full Liste. Stattdessen benötigen Sie jedes Mal ein neues Listenelement, das Sie zur full hinzufügen sollten.

+0

ziemlich neu in der Codierung, so wäre hier gerne Ihre Cleanup-Kritik. –

0

Listen werden meist unter Verwendung von Referenzen behandelt, so dass das Anhängen nicht die schedule kopiert, es wird nur seine Referenz angefügt.

Ein Trick ist die Verwendung der Modulkopie.

import copy 

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

Dies wird immer noch eine Referenz, sondern einen Verweis auf das kopierte Objekt anhängen. Dies sollte Ihnen wahrscheinlich in diesem Fall helfen

Verwandte Themen