2016-06-12 10 views
0

hallo!Warum nehmen alle Zeilen meines 2d-Arrays den Wert, den ich an nur einen übergeben habe?

Ich versuche, den folgenden Code rekursiv auszuführen, wo "Vetor" der aktuelle Zustand mehrerer Variablen ist und ich die ersten 50 in "matriz" speichern, ein 2D-Array mit 50 Zeilen und 10 Spalten. Alles wird als Null initialisiert.

Was passiert ist, dass in der ersten Iteration die erste Zeile den Wert des aktuellen "Vetor" nimmt. So weit, so gut, aber dann in der zweiten Schleife wird der "vetor" -Wert sowohl der zweiten als auch der ersten Zeile von "matriz" zugewiesen. In der letzten Iteration zum Beispiel sind alle Zeilen von "matriz" gleich dem letzten Wert von "vetor".

-I-Studie Steuerungstechnik und vor allem Programm in C oder MATLAB, so bin ich ein bisschen Neuling in Python ...

Im Folgenden wird der Teil des Codes beschrieben, wo ich glaube, das Problem ist.

  #armazena as variáveis do estado 
      vetor[0]=sc.get_ball_distance() 
      vetor[1]=sc.get_ball_angle() 
      vetor[2]=sc.get_target_angle() 
      vetor[3]=sc.get_obstacle_distance() 
      vetor[4]=sc.get_obstacle_angle() 
      vetor[5]=sc.get_spin() 
      vetor[6]=force_left_anterior 
      vetor[7]=force_right_anterior 
      vetor[8]=force_left 
      vetor[9]=force_right 

      #armazena o vetor de estado como linha na matriz 
      if cnt<50:  
        matriz[cnt]=vetor 
        cnt=cnt+1 
+0

Ich bin nicht sicher, ich sehe, was diesen Code rekursiv ist, weil es keine Funktionen definiert ist. Vielleicht könntest du versuchen, ein [mcve] mit einem [edit] zu deiner Frage zu zeigen? –

+0

es sieht aus wie vetor ist schon was du willst. Warum nicht einfach einen Vetor kopieren? – Craicerjack

+0

@Craicerjack, ich muss eigentlich die letzten 50 Werte von vetor speichern und dann in eine Datei schreiben. Die beste Option war es, sie in einer Liste zu speichern, die nur diejenigen enthält und die ersten verwirft. Nachdem ein bestimmtes Ereignis eingetreten ist, werden diese in "matriz" gespeicherten Werte in eine Datei geschrieben. –

Antwort

0

Wenn Sie haben eine Zuordnung a = b (matriz[cnt]=vetor in Ihrem Fall) in C/C++ die Kopie/asignment Konstruktor aufgerufen wird und der Inhalt des Objekts kopiert wird im Wesentlichen. Unabhängig davon, ob der Typ a ein primitiver Typ wie int/float oder struct/class ist (d.h. std::vector<T>).

In Python sind die Variablen a und b Verweise auf Objekte, wie C++ - Referenzen oder C-Zeiger (aber ohne die Pointer-Dereferenzierungssyntax).

Der c-Programmierer könnte denken, dass Modifizierung a nicht b ändern, aber dies ist nicht der Fall im folgenden Ausschnitt

a = [1, 2, 3] 
b = a 
a.append(42) 
print(b) 

ausgeben wird [1, 2, 3, 42] weil a und b beiden Referenzen auf das gleiche Objekt sind (in Erinnerung).

Um dies zu lösen, müssen Sie vetor explizit kopieren, bevor Sie es matriz[cnt] zuweisen. Schauen Sie sich Shallow and deep copy operations an. Deep Copy ist wahrscheinlich, was Sie brauchen.

Edit: Wenn vetor ist ein list ein einfacher Konstruktoraufruf wird der Trick: list(vetor)

+0

Ich vermutete so etwas, aber meine C Denkweise sagte "nee, es kann nicht sein ..." haha ​​ –

+0

Ich benutzte "new_vetor = list (vetor)", und arbeitete über die neue Variable, um die Antwort zu lösen . Vielleicht könnten Sie Ihre Antwort bearbeiten, um diese Möglichkeit hervorzuheben. –

+0

Ich war mir des Typs von 'vetor' nicht bewusst, weil Ihr Beispiel kein minimales ausgeführtes Beispiel ist. Ohne die Art des Vetors zu kennen, kann ich nicht sagen, wie man im Allgemeinen kopiert. – Markus

Verwandte Themen