Variablenname ändert sich ungewollt

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
lordmyder

Hallo,
ich habe hier einen (verinfachten) Ausschnitt aus einem Programm von mir.
Ich lege einen Wert "i" fest, und gucke ob er in einer Liste steht. Wenn er nicht drin steht, wird ein eingefügt, steht er jedoch drin wird er solang vergrößert bis er nicht mehr drin steht. Aber aus irgendeinem Grund
wird immer die Liste geändert und der letzte Wert darin gespeichert, sodass das Programm immer sagt, dass der letzte Wert schon drin steht.
Kann mir jemand sagen, was ich falsch mache bzw. wie ich es besser machen kann? (Das Programm ist aus das Problem reduziert, daher müsst ihr euch nicht über die Sinnigkeit des Codes wundern.)

Ich nutze übrigens Python 2.5 und Windows XP MCE

Code: Alles auswählen

schon_genutzt=[]
i=[0,0]
schon_genutzt.append(i)
if i not in schon_genutzt:
    pass
    
else:
     while 1:
        print schon_genutzt[0], len(schon_genutzt)
        i[0]+=1
        if i[0]>100:
            i[0]=0
            i[1]+=1
            if i[1]>200:
                i[1]=0
        if i not in schon_genutzt:
            break
Gruß
LordMyder
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Urks, seltsame Index-Manipulationen! Was soll denn das Programm machen? Denn so wie es ist Qualifiziert es sich für einen Rewrite. Wenn du das ``not`` am ``if`` entfernst, dann kannst du den ``if``-Block mit dem ``else``-Block vertauschen und das ``pass`` dann weglassen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lordmyder

Wie gesagt, das ist nur ein Fragment des Codes. Statt "pass" steht da sonst was anderes!
Ich wollte das ganze jetzt nur auf mein Problem reduzieren.
BlackJack

Zumindest in dem Fragment das Du gezeigt hast, ist das eine Endlosschleife, weil die Liste, die an `i` gebunden ist, auf jeden Fall in `schon_genutzt` steckt und auch nirgends entfernt wird.

Mir ist auch nicht ganz klar was da eigentlich erreicht werden soll. Du solltest vielleicht mal genau sagen was Du von dem Quelltext als Ergebnis erwartest und wie das tatsächliche Ergebnis davon abweicht. Da es ein "sinnloses" Beispiel ist, können wir das nur sehr schwer ohne Kristallkugel erraten. ;-)

Ansonsten fällt mir auch die "Indexerei" auf. Würde ich versuchen zu vermeiden.

`i` kann man vielleicht auch als *eine* Zahl ausdrücken und dann bei Bedarf mit der Modulo-Operation in die Bestandteile aufteilen? Oder vielleicht das ganze in eine Klasse verpacken?

Kosmetische Anmerkung: ``while 1:`` würde ich als ``while True:`` schreiben.
lordmyder

Ich glaube ich stehe gerade gehörig auf dem Schlauch.
Ich füge ein Element (nämlich [0,0]) der Liste hinzu. Dann möchte ich das nächste Element hinzufügen ([1,0]). Aber irgendwie steht das dann schon in der Liste und das [0,0] ist weg.
Das Programm, das ich gechrieben habe ist viel zu lang und auch zu schlecht programmiert als das jetzt jemand erkennen könnte was ich damit bezwecken will, deshalb lasse ich das hier weg.
Kann mir jemand sagen, warum das nicht funktioniert bzw. wie es funktioniert? Oder is meine Frage so doof, dass mich niemand versteht? =)
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

BlackJack hat geschrieben:Kosmetische Anmerkung: ``while 1:`` würde ich als ``while True:`` schreiben.
Ich nicht. Zumindest in Python 2.x ist while 1 flotter als while True.
Zuletzt geändert von mitsuhiko am Donnerstag 1. Mai 2008, 10:32, insgesamt 2-mal geändert.
TUFKAB – the user formerly known as blackbird
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

lordmyder hat geschrieben:

Code: Alles auswählen

schon_genutzt.append(i)
Dies macht keine Kopie.
lordmyder hat geschrieben:

Code: Alles auswählen

i[0]+=1
Dies ändert deine Liste.

Mit Variablennamen - wie du in deinem Betreff vermutest - hat das alles überhaupt nichts zu tun, sondern damit, dass eine Zuweisung oder ein `append()` nichts kopiert sondern eine zusätzliche Referenz auf ein Objekt erzeugt.

Stefan
lordmyder

Achsoo, freut mich, dass einer meine Frage verstanden hat! Danke!
BlackJack

Ausserdem fügst Du in der Schleife selbst ja gar nichts hinzu.

@mitsuhiko: Mir ist bis jetzt noch kein Fall untergekommen wo ``while True:`` so langsam war, dass der Unterschied das schlechter lesbare ``while 1:`` gerechtfertigt hätte. Und ich bin auch erst einmal in eine Situation gekommen wo ich das wirklich gemessen habe, weil in allen anderen Fällen das Programm nicht "zu langsam" war. Das ist eine Mikrooptimierung, die ich einfach nicht "premature" machen möchte.
Antworten