Liste mit append() und pop() verändern

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
samy-delux
User
Beiträge: 44
Registriert: Donnerstag 26. April 2007, 19:23

OK, ich hab ein neues Problem... Code:

Code: Alles auswählen

        line = []
        
        for x in self.connection[ count ]:
            id = x[ len(x)-1 ]
            
            command = "SELECT * FROM `fluege` WHERE `start` = '%s' OR `ziel` = '%s'" % ( id, id )
            self.cursor.execute ( command )
            result = self.cursor.fetchall()
            
            for y in result:                
                if y[0] != id:
                    id2 = y[0]
                else:
                    id2 = y[1]
                        
                neworigion = x
                neworigion.append( id2 )
                
                line.append( neworigion )
                ### Erste Ausgabe
                print line
                
                neworigion.pop()
                ### Zweite Ausgabe
                print line
Was ich nicht verstehe: Die erste Liste die ausgegeben wird sieht richtig aus:

Code: Alles auswählen

[[4L, 58L], [4L, 58L], [4L, 58L], [4L, 58L], [4L, 58L], [4L, 58L], [4L, 58L]]
Die Liste die jedoch nach dem pop() ausgegeben wird hat immer nur ein Element:

Code: Alles auswählen

[[4L], [4L], [4L], [4L], [4L], [4L], [4L]]
Das pop() sollte das was bereits in die 'line' Liste nicht mehr veraendern...

Wieder: Wo liegt mein Denkfehler???
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Edit by Gerold: Ich habe die Frage abgetrennt, da sie nichts mehr mit Klassen zu tun hat.

Ursprünglicher Thread: http://www.python-forum.de/topic-10398.html
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

Munter ins blaue geraten: Versuchs doch mal mit extend statt append. Vielleicht bringt das was.
LG
samy-delux
User
Beiträge: 44
Registriert: Donnerstag 26. April 2007, 19:23

Danke, das ist ja ein Support hier :wink:

Und, ne extend ist ja nicht was ich suche.... Aber danke
samy-delux
User
Beiträge: 44
Registriert: Donnerstag 26. April 2007, 19:23

Leute HILFE!! Ich hab den Code nochmal neu geschrieben, auf einem anderen "Weg" und hab genau das gleiche....
Es gibt wohl irgendeine eingenheit von append() die ich noch nicht kenne/verstehe.....

HELP
BlackJack

`line` enthält sieben mal die *selbe* Liste.

Ich nehme mal an, dass Du bei den Zeilen mit `neworigion` etwas erwartest, was nicht zutrifft. Das ist einfach nur ein anderer Name für die Liste, die auch unter dem Namen `x` erreichbar ist. Wenn man den Namen entfernt, steht da statt Zeile 16 bis 19:

Code: Alles auswählen

            x.append(id2)
            line.append(x)
Das letzte Element einer Liste lässt sich übrigens auch einfacher bekommen:

Code: Alles auswählen

id_ = x[-1]
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

samy-delux hat geschrieben:Das pop() sollte das was bereits in die 'line' Liste nicht mehr veraendern
Doch: In der line-liste steht ja keine Kopie der Daten aus neworigion, sondern ein Verweis auf neworigion. Wenn Du also neworigion veränderst, verändert sich auch line.
MfG
HWK
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

samy-delux hat geschrieben:

Code: Alles auswählen

command = "SELECT * FROM `fluege` WHERE `start` = '%s' OR `ziel` = '%s'" % ( id, id )
self.cursor.execute ( command )
Auch wenn es hier nicht so dolle wichtig erscheind, aber man sollte immer der DB-Api das quoten überlassen, also besser das ganze so machen:

Code: Alles auswählen

command = "SELECT * FROM `fluege` WHERE `start` = %s OR `ziel` = %s"
self.cursor.execute ( command, ( id, id ) )
Mehr zu diesem Theme steht im Wiki, unter: [wiki]Parametrisierte SQL Queries[/wiki]

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
samy-delux
User
Beiträge: 44
Registriert: Donnerstag 26. April 2007, 19:23

HWK hat geschrieben:
samy-delux hat geschrieben:Das pop() sollte das was bereits in die 'line' Liste nicht mehr veraendern
Doch: In der line-liste steht ja keine Kopie der Daten aus neworigion, sondern ein Verweis auf neworigion. Wenn Du also neworigion veränderst, verändert sich auch line.
MfG
HWK
Dann ist genau dass mein Problem... Wie kann ich es hinbekommen, dass dort eben doch nur eine Kopie steht, die dann von pop() nicht mehr veraendert wird???

Hier nochmal ein Beispiel wie das dymanisch erzeugte self.connection vorher und nachher aussehen sollte:

Code: Alles auswählen

# Vorher
[[[5]]]
# Nachher
[[[5]], [[5, 3], [5, 6], [5, 18]]]
Ich sitze an dem Problem jetzt 3 Tage... lol... Ich hab 3 verschiedene Ansaetze probiert und es taucher immer das gleiche Problem auf....
BlackJack

Das hier könnte eventuell schon genügen:

Code: Alles auswählen

                 line.append(x + [id2])
Allerdings steige ich durch Deinen Quelltext nicht so ganz durch, das sind für meinen Geschmack etwas zu viele verschachtelte Listen und zu wenig aussagekräftige Namen.
samy-delux
User
Beiträge: 44
Registriert: Donnerstag 26. April 2007, 19:23

I love you man!!!!
Danke!!! Das umgeht das ganze Problem perfekt!!
samy-delux
User
Beiträge: 44
Registriert: Donnerstag 26. April 2007, 19:23

Mein Programm laeuft jetzt wunderbar und findet Flugverbindungen mit beliebig vielen Umsteigflughaefen. Das ist zwar real nicht sinnvoll, aber was solls.... ;)
Es sucht so lange, bis eine Verbindung gefunden wurde.

Danke nochmal an alle die mir hier geholfen haben!!!
Antworten