Variable wird überschrieben

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo

    In meinem Code wird die Variabel obstacles1 überschrieben obwohl das eigenlich nicht sein kann.
    Nachdem xx=navigation.LueckeInX augerufen wurde hat sich der Wert von obstacles1 verändert.
    Was mach ich falsch?
    Die instanzierung der Klassen und übergabe der Karte und Navigation-Classe ist nötig weill ich jeweils ein eigenes Modul für Navigation.py und Karte.py habe

  • Wie ich sehe hast du meine Hinweise zu PEP8 ja geflissentlich ignoriert. Und Navigation ist - da es keinen Zustand hat - auch besser als Funktion implementiert. Die Klasse macht es nur unuebersichtlicher.

    Der Grund fuer dein Problem ist aber ein anderer: du hast ja offensichtlich schon daran gedacht, dass deine ScanList4 ein veraenderbares Objekt ist, und versuchst es zu kopieren. Das, was liste[:] zurueckliefert ist aber ein "shallow copy" - d.h. die einzelnen Eintraege darin sind dieselben wie in der Ursprungsliste.

    Deine Art, auf Listen per Index zuzugreifen, ist ebenfalls unueblich. In Python ist Iteration ein wichtiges Konzept, und drueckt die meisten Probleme besser aus.

    Last but VERY MUCH not least: Funktionen sollten moeglichst pur sein, d.h. keine Seiteneffekte auf ihre Argumente ausueben, und stattdessen das Ergebnis ihrer Berechnung zurueckgeben! Dann kann man sie wesentlich universeller einsetzen, und wundert sich nicht ueber solche Probleme wie du sie hast.


    Drei Tipps, um so etwas zu vermeiden:

    - da deine Obstacles eine read-only Datenstruktur sein sollen, benutze auch so eine: Tupel. Wenn du "Obstacles = ((-90,10),(-80,20) ...)" schreibst, kannst du genauso darauf arbeiten - aber es fliegt dir um die Ohren, wenn du veraendert zugreifst.
    - du arbeitest mit einem deepcopy aus dem Modul copy. Das kopiert den gesamten Objektgraphen.
    - du programmierst idomatisches Python, was in diesem Fall bedeutet: durch List-Comprehensions erzeugst du ein *neues* Listenobjekt, mit den gewuenschten Eigenschaften, das du zurueck gibst, statt auf einer Kopie mit Indexen rumzuwurschteln:

    Code
    def lueckeInX(dist, obstacles):
       return [(ox, 0 if oy > dist else oy) for ox, oy in obstacles]
    
    
    if __name__ == "__main__":
    
    
      print lueckeInX(20, [[-90,10],[-80,20],[-70,10],[-60,10],[-50,110],
            [-40,130],[10,140],[20,10],[30,10],[40,110],[50,110],[60,110],[70,110]])
  • Danke für die Hilfe.
    Habe mir sogar eine Checkliste erstellt um die PEP8 Richtlinien umzusetzen-leider noch nicht den ganzen Code umgeschrieben...
    Dachte liste[:] sei deepcopy..?

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!