Seite 1 von 1

Verfasst: Donnerstag 26. April 2007, 21:40
von samy-delux
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???

Verfasst: Donnerstag 26. April 2007, 22:05
von gerold
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

Verfasst: Donnerstag 26. April 2007, 22:13
von CrackPod
Munter ins blaue geraten: Versuchs doch mal mit extend statt append. Vielleicht bringt das was.
LG

Verfasst: Donnerstag 26. April 2007, 22:16
von samy-delux
Danke, das ist ja ein Support hier :wink:

Und, ne extend ist ja nicht was ich suche.... Aber danke

Verfasst: Donnerstag 26. April 2007, 22:55
von samy-delux
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

Verfasst: Freitag 27. April 2007, 00:11
von 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]

Verfasst: Freitag 27. April 2007, 12:45
von HWK
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

Verfasst: Freitag 27. April 2007, 13:46
von jens
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]

Verfasst: Freitag 27. April 2007, 13:58
von samy-delux
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....

Verfasst: Freitag 27. April 2007, 14:27
von 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.

Verfasst: Freitag 27. April 2007, 14:31
von samy-delux
I love you man!!!!
Danke!!! Das umgeht das ganze Problem perfekt!!

Verfasst: Freitag 27. April 2007, 16:22
von samy-delux
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!!!